如何让脚本每天在 Mac OS X 上运行?

Pau*_*ite 75 script launchd cron macos

克朗?推出?卡尔??

如果是这样,如何?

Che*_*ion 73

作为参考,所有 3 个选项都可以使用。然而,iCal 选项比其他选项有更多限制。

(如其他答案中所述,有用于编辑 cron 和 launchd 的 GUI)

Cron 是最直接和众所周知的,并且有许多可用的教程。Coles 注释是将下面的最后一行添加到您的 crontab 中(通过编辑/etc/crontabcrontab在命令行上使用):

MM HH DD MM WKD -- Minutes, Hour, Day, Month, Weekday (eg. Sun, Mon)
MM HH * * * USERNAME /PATH/TO/SCRIPT
00 3 * * * chealion /myscript.sh "Runs at 03:00 every day"
Run Code Online (Sandbox Code Playgroud)

在 Mac OS X 中,cron实际上已被替换launchdlaunchd向后兼容,cron这意味着您仍然可以使用cron但它实际上launchd正在完成所有工作。

如果您想使用,launchd您还需要查看超级用户的其他问题:(例如,我如何以 root 身份运行 launchd 命令?)关于您想要保存配置文件(plist 文件)的位置因为它何时运行取决于它存储在哪个目录中以及它是如何加载的(例如,您是否使用了 sudo) - 类似于 cron。

下面是一个每天运行 launchd plist 的示例(确保文件和标签相同 - 减去标签的 plist) - 该脚本每天在午夜后 3 分钟运行:

<?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>KeepAlive</key>
    <false/>
    <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>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>00</integer>
        <key>Minute</key>
        <integer>03</integer>
    </dict>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

还值得注意的是,如果启动任务是在计算机休眠或关闭时安排的,它们将在计算机再次可用(打开或唤醒它)时运行 - 尽管无论有多少天都只会运行一次是。编辑:我刚刚在 Apple 文档中说,如果机器关闭,那么在那段时间内您将丢失任何启动事件,(您的脚本不会在启动时启动),(睡眠会在醒来时启动脚本)


另一种选择是使用“ at ”(用“man at”检查手册页)。脚本可以重新安排自己,例如:

echo "sh $0 $@" | at `date +%H:%M` tomorrow
Run Code Online (Sandbox Code Playgroud)

(使用“+ 10 分钟”而不是“明天”每 10 分钟运行一次;要停止调度,只需执行“at -l”列出计划的作业 ID,然后执行“at -r id ”删除作业)

您可能必须首先使用(参见https://superuser.com/a/43680)启动相应的守护进程 (atrun ):

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist
Run Code Online (Sandbox Code Playgroud)

优点:快速修复,不需要 sudo/root 访问权限,易于执行复杂的调度模式缺点:不是 OS X(已启动)的标准调度方法

  • 先生,对于您的示例启动配置文件,我可以*吻*您。但我不会。 (10认同)
  • `launchd` 是在 OS X 下运行的方式。 (5认同)

小智 11

LaunchControl是 launchd/launchctl 的另一个 GUI。虽然其他人提到的替代方案完全能够每天启动脚本,但使用 LaunchControl 您可以配置复杂的时间表(例如“每个工作日一次,周末每小时 2 点到 8 点之间”)。它也是(AFAIK)实际验证工作的唯一工具。如果工作没有按预期工作,它会告诉你原因。

只要您愿意,就可以免费试用。

  • 虽然可以免费试用/使用,但开发人员希望您为许可证付费。http://sites.fastspring.com/somazone/product/shop (3认同)

Zor*_*ran 6

CronniX是一个很好的 GUI 前端,用于在 mac 上安排 cron 作业......如果你不想深入研究 cron 文档,它非常不错。


小智 5

这是一个简单、免费的实用程序,用于生成 plist XML:

http://www.gieson.com/Library/projects/utilities/launcha/

使用此实用程序,无需安装程序,只需将结果保存到 Library/LaunchAgents 文件夹即可。