如何使用launchd注册代理

Kon*_*lph 14 launchd macos

我无法在 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>
Run Code Online (Sandbox Code Playgroud)

我已将此脚本放在 path 中~/Library/LaunchAgents

接下来,我使用注册了脚本

launchctl load ~/Library/LaunchAgents/sync.plist
Run Code Online (Sandbox Code Playgroud)

最后,为了测试它是否有效,我开始了这项工作:

 launchctl start net.madrat.utils.sync
Run Code Online (Sandbox Code Playgroud)

- 什么都没有发生。rsync在终端中手动执行命令会产生预期的结果。

我相当确定该作业已正确注册,因为如果我尝试启动一个不存在的作业,我会收到一条错误消息(我在上面的命令中没有收到)。

我做错了什么?

Ark*_*rko 12

长答案:

如果不了解一些基本原理,就很难使用 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.
Run Code Online (Sandbox Code Playgroud)

简短的回答:

您的 plist 文件的名称可能有误,现在无法测试,但我会将其设置为 net.madrat.utils.sync.plist. unload如果您编辑了文件,在加载它之前先启动您的守护进程也可能很有用。


Cas*_*yIT 6

Lingon是一个很好的 GUI 工具来管理 launchd。该项目现在似乎不受支持......但它肯定仍然适用于 10.5.x。

但是对于你的具体问题......你有没有尝试过

sudo launchctl list 
Run Code Online (Sandbox Code Playgroud)

这将告诉您 .plist 是否正确触发。如果守护进程没有启动,它将返回 1,如果成功则返回 '0'。也许寻找那个。

每当我看到“1”时,通常是因为我将脚本放在错误的位置、打错了字或设置了错误的权限。

另外....经常重启..我见过

launchctl start
Run Code Online (Sandbox Code Playgroud)

在重新启动时无效..

另外,在你的问题仔细一看....为什么不把那rsync的代码放到一个bash脚本......并把它贴在/usr/bin/.....那么你可以只是chmod+x该文件....并简化您的.plist随时触发该脚本....