Launchd 使用手动 "launchctl start" 运行,但不在 StartCalendarInterval 上运行
Launchd runs with manual "launchctl start", but not on StartCalendarInterval
我有一个非常简单的启动守护程序 com.daily.vocab.plist,它只是 运行 一个基本脚本。它应该在每天的特定时间 运行(使用 StartCalendarInterval),但我无法做到这一点。许多在线帖子都说 运行 一两分钟,但对我来说从来没有 运行。
我测试的时候一直把运行时间设置为以后5分钟,现在设置为每分钟第0秒运行,这样我可以让它工作。一旦开始工作,我会将其设置为我想要的每日 运行 时间。
根据this tutorial中的建议,它保存在/Library/LaunchDaemons中。我用 launchctl load /Library/LaunchDaemons/com.daily.vocab.plist
手动加载了它。事实上,当我 运行 launchctl list
时,我确实看到它已经加载。当我用 launchctl start com.daily.vocab
手动告诉它 运行 时,它会立即按预期工作。唯一的问题是 StartCalendarInterval 似乎被忽略了。我在我的 Macbook 上使用 Mavericks。
这是文件:com.daily.vocab.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.daily.vocab</string>
<key>Program</key>
<string>/Users/MGS/developer/projects/vocab-sms/scripts/DEvocab.sh</string>
<key>StartCalendarInterval</key>
<dict>
<key>Second</key>
<integer>0</integer>
</dict>
</dict>
</plist>
理想情况下,我相信我希望它每天在 7:15am 运行 使 StartCalendarInterval
部分改为:
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>7</integer>
<key>Minute</key>
<integer>15</integer>
</dict>
如果你甚至可以分享一个 LaunchDaemon 的例子,你必须使用 StartCalendarInterval 和你为让它工作所做的每一步(例如 运行ning launchctl load x.x.x.plist
),那将非常有帮助!
解决方案:这个本地守护进程实际上应该是一个用户代理,所以需要在~/Library/LaunchAgents目录中保存和加载。从那里,我还需要卸载代理并重新加载代理。
注意:Daemons/Agents 在您 unload/load 之前不会在 launchd 中自动更新。您不能只保存更新后的 .plist 并期望它能正常工作!
保存在 /Library/...
中的 launchd plists 是 local 域中的守护进程/代理,必须用 sudo
加载。如果没有 sudo
,您将在与实际路径不匹配的 user 域中加载守护进程。
既然您正在调用 user 域中的脚本,请将脚本保存在 ~/Library/LaunchAgents
中(它不是守护进程)。 plist 语法应该是正确的。
我有一个非常简单的启动守护程序 com.daily.vocab.plist,它只是 运行 一个基本脚本。它应该在每天的特定时间 运行(使用 StartCalendarInterval),但我无法做到这一点。许多在线帖子都说 运行 一两分钟,但对我来说从来没有 运行。
我测试的时候一直把运行时间设置为以后5分钟,现在设置为每分钟第0秒运行,这样我可以让它工作。一旦开始工作,我会将其设置为我想要的每日 运行 时间。
根据this tutorial中的建议,它保存在/Library/LaunchDaemons中。我用 launchctl load /Library/LaunchDaemons/com.daily.vocab.plist
手动加载了它。事实上,当我 运行 launchctl list
时,我确实看到它已经加载。当我用 launchctl start com.daily.vocab
手动告诉它 运行 时,它会立即按预期工作。唯一的问题是 StartCalendarInterval 似乎被忽略了。我在我的 Macbook 上使用 Mavericks。
这是文件:com.daily.vocab.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.daily.vocab</string>
<key>Program</key>
<string>/Users/MGS/developer/projects/vocab-sms/scripts/DEvocab.sh</string>
<key>StartCalendarInterval</key>
<dict>
<key>Second</key>
<integer>0</integer>
</dict>
</dict>
</plist>
理想情况下,我相信我希望它每天在 7:15am 运行 使 StartCalendarInterval
部分改为:
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>7</integer>
<key>Minute</key>
<integer>15</integer>
</dict>
如果你甚至可以分享一个 LaunchDaemon 的例子,你必须使用 StartCalendarInterval 和你为让它工作所做的每一步(例如 运行ning launchctl load x.x.x.plist
),那将非常有帮助!
解决方案:这个本地守护进程实际上应该是一个用户代理,所以需要在~/Library/LaunchAgents目录中保存和加载。从那里,我还需要卸载代理并重新加载代理。
注意:Daemons/Agents 在您 unload/load 之前不会在 launchd 中自动更新。您不能只保存更新后的 .plist 并期望它能正常工作!
保存在 /Library/...
中的 launchd plists 是 local 域中的守护进程/代理,必须用 sudo
加载。如果没有 sudo
,您将在与实际路径不匹配的 user 域中加载守护进程。
既然您正在调用 user 域中的脚本,请将脚本保存在 ~/Library/LaunchAgents
中(它不是守护进程)。 plist 语法应该是正确的。