В чем разница между "периодическим" и "cron" в OS X?
- Я купил книгу по OS X и там написано, что launchd теперь управляет расписанием задач cron, это правда?
Также это говорит о том, что если я помещаю команды в
/etc/daily.local
что они будут выполняться после сценариев в/etc/periodic/daily
,В моем
/etc/daily.local
сценарий, у меня просто есть простойtouch
Команда (которая просто создает файл), чтобы я мог проверить, работает ли он.Я запускал вручную
sudo /usr/sbin/periodic daily
заставить его выполнить. Файл не был создан.
Где я ошибся или неправильно что-то понял? Как я должен планировать задачи cron в OSX Lion? Почему моя книга сказала мне сделать это таким образом?
Я начинаю думать periodic
отличается от cron
, Что такое /usr/sbin/periodic
?
2 ответа
Файлы в /etc/period действительно отличаются от cron и crontabs. Я не советую возиться с этим. Вместо этого используйте корневую запись в crontab. Бежать sudo crontab -e
и добавьте эти строки:
MAILTO=me@foo.com
0 0 * * * sh /path/to/your/script
Первая строка указывает cron отправлять любые выходные данные из скрипта на me@foo.com; измените me@foo.com на свой адрес электронной почты.
Вторая строка говорит cron запускать ваш скрипт каждый день в полночь.
- Я купил книгу об OS X, и в ней написано, что launchd теперь управляет планированием задач cron, это правда?
Да, это правда, согласно разделу «Планирование заданий по времени» в Руководстве по программированию демонов и служб. Задания устарели, и их использование является предпочтительным способом управления задачами планирования, а не .
Фактически, оба и управляются , как вы можете видеть ниже или описано на страницах руководства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 у меня есть простая сенсорная команда (которая просто создает файл), поэтому я могу проверить, работает ли она.
я запускал вручную
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
- Где я ошибся или что-то не так понял? Как мне планировать задания cron в OSX Lion? Почему моя книга посоветовала мне сделать это именно так?
/questions/16530/v-chem-raznitsa-mezhdu-periodicheskim-i-cron-v-os-x/16532#16532 был хороший и краткий ответ от @kyle-jones, я собираюсь привести пример вlaunchd
путь сюда, проверьте это здесь для более подробной информации.
Следующий список свойств запускает программуhappybirthday
в полночь каждый раз, когда 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>
Я начинаю думать, что это отличается от
cron
. Что/usr/sbin/periodic
?
The periodic
это утилита, написанная на языке оболочки, которая организовывает сценарии в отдельные папки с именамиdaily
,weekly
иmonthly
и предназначен для вызоваlaunchd(8)
для выполнения сценариев оболочки, расположенных в указанном каталоге, в нужное время.
$ 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