OS X 上的“periodic”和“cron”有什么区别?

OS X 上的“periodic”和“cron”有什么区别?
  1. 我买了一本关于 OS X 的书,上面说启动现在可以控制 cron 任务的调度了,是真的吗?
  2. 它还说如果我在其中放置命令/etc/daily.local,它们将在脚本之后执行/etc/periodic/daily

    在我的/etc/daily.local脚本中,我只有一个简单的touch命令(它只是创建一个文件),所以我可以测试它是否有效。

    我手动运行

    sudo /usr/sbin/periodic daily 
    

    强制执行。该文件从未被创建。

  3. 我哪里做错了,或者误解了什么?我应该如何在 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

  1. 我买了一本关于 OS X 的书,上面说启动现在可以控制 cron 任务的调度了,是真的吗?

是的,确实如此,根据调度定时作业在守护进程和服务编程指南中。periodic作业已被弃用,使用launchd是管理调度任务的首选方式,而不是cron

事实上,periodiccron都由 管理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>
  1. 它还说如果我将命令放在 /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
  1. 我哪里做错了,或者误解了什么?我应该如何在 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 脚本编写的实用程序,它将脚本组织在名为dailyweekly和的独立文件夹中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

相关内容