如何使用launchd注册代理


13

我无法安排与定期发布launchctl/ launchd在OS X(豹)。基本上,我无法在网络上找到逐步的说明列表,直观的方法不起作用。

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在终端中手动执行命令会产生预期结果。

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

我做错了什么?

Answers:


5

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

但是对于你的具体问题......你试过吗?

sudo launchctl list 

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

每当我看到'1'时,通常是因为我将脚本放在错误的位置,输入错误或设置权限不正确。

还....经常重启..我见过

launchctl start

在重启时没有效果..

此外,在仔细查看你的问题....为什么不把这个rsync代码放入bash脚本...并坚持下去/usr/bin/.....然后你可以只是chmod+x那个文件....并简化你的.plist随时随地发射该脚本....


谢谢,将命令放入一个额外的shell文件并启动它就可以了。这是一个非常不令人满意的解决方案,但是......为什么不直接调用命令呢?顺便说一句,launchctl list 显示1,但只有后,我开始手动代理使用launchctl start
康拉德鲁道夫2010年

我不是肯定的,但我认为launchd .plist文件实际上只是用于定义守护进程的“按需启动”标准......也许它不确定如何处理你在<key>中传递的参数ProgramArguments </键>。
CaseyIT 2010年

11

答案很长:

如果不理解一些基本原则,很难与launchd一起工作。所以很可能你找不到任何一步一步的指令,它有很多功能。一个好的举措是前往ADC的入门指南:http//developer.apple.com/macosx/launchd.html

您还可以阅读手册页launchdlaunchctl以及文件的.plist语法launchd.plist

关于放置代理或deamon的位置经常存在误解,所以让我在这里推送一些信息:

  • 如果即使没有用户登录也需要运行您的作业,请将其放在/ 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.plistunload如果您编辑了文件,在加载它之前首先执行deamon 可能也很有用。


谢谢(你的)信息。但是:(1)我已经阅读了你上面链接的所有文件,还有几个。它实际上没有说明如何启动代理。(至少,我没有在任何地方找到它。)如果我的直觉方法有效,那就没问题了。(2)更改文件名也不起作用。:-((3)一些信息已经过时。例如,他们建议launchd bash调试命令- 但这不适用于Leopard(launchd无法直接启动)。
Konrad Rudolph 2010年

@Konrad Rudolph:欢迎你::) @Skylarking得到一些有趣的观点:你检查了文件的预设吗?或者使用sudo命令?我还有时需要重启才能使launchctl正常工作。
Arko 2010年

2

我找不到文档,这实际上是标准行为,但似乎launchd需要plist文件中的绝对路径。所以试试吧/usr/bin/rsync。适合我!


0

尝试这个,我的脚本不使用程序部分工作,只是程序args ...

更换

    <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>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>rsync</string>
        <string>-ar</string>
        <string>/path/to/folder/</string>
        <string>/path/to/backup/</string>
    </array>

0

尝试将此键添加到plist文件中

    <key>KeepAlive</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>

0

你的.plist文件中有一个错误的东西和一个狡猾的东西(在早期的答案中已经触及了这些点中的每一个;我将它们放在一起)。

你写得更好:

<key>ProgramArguments</key>
<array>
  <string>/usr/local/bin/rsync</string>
  <string>-ar</string>
  <string>/path/to/folder/</string>
  <string>/path/to/backup/</string>
</array>

ProgramArguments数组中的第一个参数是要执行的程序 - 你省略了它。如果Program省略了键,则默认为第一个参数ProgramArguments; 将它指定一次可能是明智之举。

因为你省略了第一个参数,你的.plist 调用rsync(通过命名Program),但rsync的'第一个参数'本来是/path/to/folder,而不是-ar(运行程序在ps输出之前会非常短暂地显示,然后退出一个错误,但命名为-ar,这是第0个参数的内容)。

你不,包括路径rsync,但在这种背景下,它可能是审慎的做法是这样做的,以避免依赖于PATH被适当设置。

这方面的文件是launchd.plist(5)。请注意,该联机帮助页强调ProgramArguments密钥的值传递给execvp(3)。这execvp是解释PATH搜索的手册页。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.