我无法在 OS X (Leopard) 上安排定期启动launchctl
。launchd
基本上,我无法在网上找到分步说明列表,而且直观的方法不起作用。
文件sync.plist
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>net.madrat.utils.sync</string>
<key>Program</key>
<string>rsync</string>
<key>ProgramArguments</key>
<array>
<string>-ar</string>
<string>/path/to/folder/</string>
<string>/path/to/backup/</string>
</array>
<key>StartInterval</key>
<integer>7200</integer>
</dict>
</plist>
我已将该脚本放入路径中~/Library/LaunchAgents
。
接下来,我挂号的脚本使用
launchctl load ~/Library/LaunchAgents/sync.plist
最后,为了测试它是否有效,我开始工作:
launchctl start net.madrat.utils.sync
rsync
– 什么都没发生。在终端中手动执行命令会产生预期的结果。
我非常确定该作业已正确注册,因为如果我尝试启动一个不存在的作业,我会收到一条错误消息(我没有在上述命令中获取)。
我做错了什么?
答案1
林贡是一款用于管理 launchd 的优秀 GUI 工具。该项目目前似乎不受支持...但它在 10.5.x 上肯定仍能运行。
但对于你的具体问题...你试过吗
sudo launchctl list
这将告诉您 .plist 是否正确启动。如果守护进程未启动,它将返回 1,如果启动成功,它将返回“0”。也许可以看看这个。
每当我看到“1”时,通常是因为我将脚本放错了位置、输入了错误字符或错误地设置了权限。
另外...经常重启..我见过
launchctl start
重新启动后无效..
另外,仔细看看你的问题......为什么不把那个 rsync 代码放入 bash 脚本中...然后把它粘进去/usr/bin/
.....然后你就可以只使用chmod+x
那个文件......并简化你的 .plist 以在你需要的时候触发该脚本....
答案2
长答案:
如果不了解一些基本原理,就很难使用 launchd。因此,您可能找不到任何分步说明,因为它功能太多了。一个好办法是前往 ADC 上的入门指南:http://developer.apple.com/macosx/launchd.html
您还可以阅读的手册页launchd
和launchctl
.plist 文件语法launchd.plist
。
人们经常会对将代理或守护进程放在哪里产生误解,因此让我在这里提供一些有关它的信息:
- 如果您的作业需要在没有用户登录时运行,请将其放在 /Library/LaunchDaemons 中。
- 如果它仅在用户登录时有用,请将其放在/Library/LaunchAgents中,或者放在特定用户的个人LaunchAgents目录中(~/Library/LaunchAgents)。
- 不要将您的工作放在 /System/Library 中,该目录是为系统提供的守护进程保留的。
~/Library/LaunchAgents Per-user agents provided by the user. /Library/LaunchAgents Per-user agents provided by the administrator. /Library/LaunchDaemons System wide daemons provided by the administrator. /System/Library/LaunchAgents Mac OS X Per-user agents. /System/Library/LaunchDaemons Mac OS X System wide daemons.
简短回答:
您的 plist 文件的名称可能有误,目前无法测试,但我会将其设置为 。如果您编辑了该文件,在加载之前先启动守护进程net.madrat.utils.sync.plist
可能也很有用。unload
答案3
我找不到文档证明这实际上是标准行为,但似乎 launchd 需要 plist 文件中的绝对路径。所以试试/usr/bin/rsync
吧。对我来说很管用!
答案4
尝试将这些键添加到您的 plist 文件中
<key>KeepAlive</key>
<true/>
<key>RunAtLoad</key>
<true/>