谁能推荐一个很好的教程来(从头开始)编写cron风格的启动工作?


19

我有一个很简单的工作,我想每小时运行一次。我可以使用来做cron,但是我想我会用它来学习的launchd,因为我听到了关于它的好消息。我已经将该man launchd.plist页面作为参考,但是我正在寻找更多有关构建示例作业的内容。


这应该移到Stackoverflow。
菲利普·里根

5
@Philip Regan我考虑过了,但是对我来说并没有涉及太多的编程。如果我一直在问一个cron问题,superuser.com是不合适的地方吗?由于launchd是Apple的版本cron(还有daemontools,以及其他可能的版本),所以我认为这是我最好的选择。
汉克·盖伊

您也可以将其放在自动脚本中并从iCal运行-如果它按您的方式运行
2011年

有点讽刺的是,三年后,我需要自己执行cron / launch程序,发现自己又以完全不同的眼光看了这个问题。关于如何处理已启动的问题,Stack Overflow意见不一,但他们确实不喜欢这些问题。只是认为整个情况很有趣。+1
菲利普·里根

Answers:


14

launchd以root用户身份运行守护程序(/Library/LaunchDaemons/System/Library/LaunchDaemons),并且无论用户是否登录,都将运行它们。当用户以该用户身份登录时,将运行启动代理(/Library/LaunchAgents/~/Library/LaunchAgents/)。您不能使用setuid来更改在守护程序上运行脚本的用户。该/System目录是为Mac OS X任务保留的,因此,我建议您根据需要将您的launchdplist放在/Library~/Library文件夹中。

因此,第一步是确定您是要创建代理还是守护程序。

第二步是制作.plist文件。您可以使用诸如Lingon之类的基于GUI的程序来解决此问题,也可以只使用自己喜欢的文本编辑器:

样本.plist运行每小时的脚本(StartInterval或者StartIntervalCalendar是我们想要的按键- StartInterval一个项目的每一个发生x秒,StartIntervalCalendar在特定的时间和/或日期见。以超级用户126907对我StartCalendarInterval制造为例):

<?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>local.IDENTIFIER_HERE.SOMETHING</string>
    <key>OnDemand</key>
    <true/>
    <key>RunAtLoad</key>
    <false/>
    <key>UserName</key>
    <string>USERNAME HERE</string>
    <key>Program</key>
    <string>/PATH/TO/SCRIPT</string>
    <key>ProgramArguments</key>
    <array>
        <string>Argument_1</string>
        <string>Argument_2</string>
    </array>
    <key>StartInterval</key>
    <integer>3600</integer>
</dict>
</plist>

.plist根据需要修改,以指向您的脚本和任何必要的参数(参数在单独的行上),并使用与Label值相同的名称保存文件,但.plist在文件末尾。(例如,local.my-mac.flickrstats将另存为local.my-mac.flickrstats.plist)。如果还没有,请将该.plist文件移动到/Library/LaunchDaemons创建守护程序时(始终运行)或~/Library/LaunchAgents(仅您已登录)或/Library/LaunchAgents(任何用户已登录)。

要开始作业,您需要launchctl根据需要运行以加载文件。对于中的项目/Library,您应该使用sudo:例如,sudo launchctl load -w /PATH/TO/PLIST

作为参考,还请检查有关超级用户的以下问题:以root用户身份启动命令加载系统范围的守护程序以及如何获取每天运行的脚本


4

我知道这不是一个很好的教程,但是您可以查看Apple 的《Daemons and Services编程指南》,其中有关于计划定时作业的部分。

我知道这不是完整的教程,但是有了它,您可以了解的基础知识launchd

它还提供了一个crond任务示例:

<?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>com.apple.periodic-daily</string>
    <key>ProgramArguments</key>
    <array> 
        <string>/usr/sbin/periodic</string>
        <string>daily</string>
    </array>
    <key>LowPriorityIO</key>
    <true/>
    <key>Nice</key>
    <integer>1</integer>
    <key>StartCalendarInterval</key>
    <dict>  
        <key>Hour</key>
        <integer>3</integer>
        <key>Minute</key>
        <integer>15</integer>
    </dict>
</dict>
</plist>

我之所以投票,是因为您承认资源不是我想要的,这让我有点RTFM的感觉,但我对此进行了重新考虑,并且想撤消我的投票。不幸的是,除非对问题进行了编辑(时间过长),否则我将无法进行编辑,而且我没有足够的代表进行编辑。你可以调整一些东西吗?谢谢。
汉克·盖伊

@汉克·盖伊:感谢您的评论。我也编辑了答案。
Studer 2010年


2

我知道您在寻找教程,但是在偶然的情况下有人来这里寻找工具来帮助他们制作/编辑已发布的条目,我以前使用过:Lingon(sourceforge)

它不再被积极开发,但是可以正常工作(并且显然包括源代码等)。我已在Snow Leopard上使用它来计划备份到Amazon云等。


Lingon现在在App Store中,因此仍处于活动状态,只是不免费,请参见< peterborgapps.com/lingon >
user151019 2011年

苹果政策要求已严重削弱了该应用商店的版本。SourceForge预编译版本运行良好-尽管保存时出现模态对话框,告诉我注销或重新启动以启用守护程序,但不会关闭。我必须从其菜单中退出程序(而不是强制退出),并检查以确认它已正确保存了文件。不支持该文件和目录触发器,也无法创建在AppStore版本中以root身份运行的内容。
marfarma 2011年
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.