- 我买了一本关于 OS X 的书,上面说启动现在可以控制 cron 任务的调度了,是真的吗?
它还说如果我在其中放置命令
/etc/daily.local
,它们将在脚本之后执行/etc/periodic/daily
。在我的
/etc/daily.local
脚本中,我只有一个简单的touch
命令(它只是创建一个文件),所以我可以测试它是否有效。我手动运行
sudo /usr/sbin/periodic daily
强制执行。该文件从未被创建。
我哪里做错了,或者误解了什么?我应该如何在 OSX Lion 中安排 cron 任务?为什么我的书告诉我这样做?
我开始思考periodic
不同于cron
。 是什么/usr/sbin/periodic
?
答案1
/etc/periodic 下的文件确实与 cron 和 crontabs 不同。我不建议乱改它。改用 root crontab 条目。运行sudo crontab -e
并添加以下行:
[email protected]
0 0 * * * sh /path/to/your/script
第一行告诉 cron 将脚本的所有输出邮寄至[电子邮件保护]; 改变[电子邮件保护]发送至您的电子邮件地址。
第二行告诉 cron 每天午夜运行你的脚本。
答案2
- 我买了一本关于 OS X 的书,上面说启动现在可以控制 cron 任务的调度了,是真的吗?
是的,确实如此,根据调度定时作业在守护进程和服务编程指南中。periodic
作业已被弃用,使用launchd
是管理调度任务的首选方式,而不是cron
。
事实上,periodic
和cron
都由 管理launchd
,正如您在下面看到的或在periodic(8)
和的手册页中描述的cron(8)
。
$ sudo launchctl list | grep 'periodic\|cron'
6706 0 com.apple.systemstats.microstackshot_periodic
- 0 com.apple.periodic-monthly
- 0 com.apple.periodic-weekly
21057 0 com.apple.periodic-daily
- 0 com.vix.cron
$ cat com.vix.cron.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>com.vix.cron</string>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/cron</string>
</array>
<key>KeepAlive</key>
<dict>
<key>PathState</key>
<dict>
<key>/etc/crontab</key>
<true/>
</dict>
</dict>
<key>QueueDirectories</key>
<array>
<string>/usr/lib/cron/tabs</string>
</array>
<key>EnableTransactions</key>
<true/>
</dict>
</plist>
- 它还说如果我将命令放在 /etc/daily.local 中,它们将在 /etc/periodic/daily 中的脚本之后执行。
在我的 /etc/daily.local 脚本中,我只有一个简单的 touch 命令(它只创建一个文件),所以我可以测试它是否有效。
我手动运行
sudo /usr/sbin/periodic daily 强制执行。该文件从未创建过。
我测试了它,它在我的 macOS Catalina 机器上运行良好。该/etc/daily.local
文件在文件中定义/etc/defaults/periodic.conf
并由脚本执行/etc/periodic/daily/999.local
。因此请确保您在那里拥有这两个文件。
$ cat /etc/periodic/daily/999.local
#!/bin/sh
#
# $FreeBSD: src/etc/periodic/daily/999.local,v 1.5 2001/06/01 16:40:55 dougb Exp $
#
# Run the old /etc/daily.local script. This is really for backwards
# compatibility more than anything else.
#
# If there is a global system configuration file, suck it in.
#
if [ -r /etc/defaults/periodic.conf ]
then
. /etc/defaults/periodic.conf
source_periodic_confs
fi
rc=0
for script in $daily_local
do
echo ''
case "$script" in
/*)
if [ -f "$script" ]
then
echo "Running $script:"
sh $script || rc=3
else
echo "$script: No such file"
[ $rc -lt 2 ] && rc=2
fi;;
*)
echo "$script: Not an absolute path"
[ $rc -lt 2 ] && rc=2;;
esac
done
exit $rc
- 我哪里做错了,或者误解了什么?我应该如何在 OSX Lion 中安排 cron 任务?为什么我的书告诉我这样做?
虽然它对
https://superuser.com/a/391214/106136@kyle-jones,我将在launchd
这里给出示例,请查看这里更多细节。
以下属性列表happybirthday
在每次 7 月 11 日是星期日的午夜运行程序,将其保存为“foo.plist”并使用命令运行它launchctl load /path/to/plist
。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.happybirthday</string>
<key>ProgramArguments</key>
<array>
<string>happybirthday</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Day</key>
<integer>11</integer>
<key>Hour</key>
<integer>0</integer>
<key>Minute</key>
<integer>0</integer>
<key>Month</key>
<integer>7</integer>
<key>Weekday</key>
<integer>0</integer>
</dict>
</dict>
</plist>
我开始思考
periodic
不同于cron
。 是什么/usr/sbin/periodic
?
是periodic
一个用 shell 脚本编写的实用程序,它将脚本组织在名为daily
、weekly
和的独立文件夹中monthly
,旨在由 调用以launchd(8)
在适当的时间执行位于指定目录中的 shell 脚本。
$ file `which periodic`
/usr/sbin/periodic: POSIX shell script text executable, ASCII text
$ tree -Ca /etc/periodic/
/etc/periodic/
|-- daily
| |-- 110.clean-tmps
| |-- 130.clean-msgs
| |-- 140.clean-rwho
| |-- 199.clean-fax
| |-- 310.accounting
| |-- 400.status-disks
| |-- 420.status-network
| |-- 430.status-rwho
| `-- 999.local
|-- monthly
| |-- 199.rotate-fax
| |-- 200.accounting
| `-- 999.local
`-- weekly
`-- 999.local