如何使用 launchd 注册代理

如何使用 launchd 注册代理

我无法在 OS X (Leopard) 上安排定期启动launchctllaunchd基本上,我无法在网上找到分步说明列表,而且直观的方法不起作用。

文件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

您还可以阅读的手册页launchdlaunchctl.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/>

相关内容