Вот загадка: у меня есть .plist в / Library / LaunchDaemons, который настроен на запуск в 3:01 каждый день, но он не запустить. Однако (это загадочная часть), когда он запускается с помощью launchctl, все работает нормально:
sudo launchctl start com.my.daemon
Вдобавок (это еще более загадочно), если вы выгрузите демон, измените StartCalendarInterval на несколько минут в будущем, а затем повторно загрузите демон, все также будет работать нормально - в указанное время через несколько минут в будущем демон выполнит сценарий.
Так что, по сути, единственный способ, которым это не сработает, - это то, как я действительно хочу, чтобы это работало, а именно начало следующего дня в 3:01 ночи.
Для справки вот как выглядит скрипт. Он работает на Tiger 10.4.11:
<?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.my.daemon</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/open</string>
<string>/Users/joe/import/do_import.fp7</string>
</array>
<key>StandardErrorPath</key>
<string>/Library/Logs/my_err.log</string>
<key>StandardOutPath</key>
<string>/Library/Logs/my_out.log</string>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>3</integer>
<key>Minute</key>
<integer>1</integer>
</dict>
<key>UserName</key>
<string>joe</string>
<key>WorkingDirectory</key>
<string>/Users/joe/import/</string>
</dict>
</plist>
Вы захотите узнать, что говорят журналы. Так как вчера я много возился с этим и в ходе копирования и вставки мог случайно загрузить другие демоны с тем же именем, я не уверен, что это действительно журнал рассматриваемого демона. Тем не менее, это то, что было в журнале ошибок. (Однако имейте в виду, что когда демон запускается либо с помощью 'launchctl start', либо с помощью StartCalendarInterval через пару минут в будущем, журналы пусты.)
2012-01-21 03:00:53.199 open[816] CFLog (0): CFMessagePort: bootstrap_register(): failed 1100 (0x44c), port = 0x2203, name = 'Processes-0.151912449' See /usr/include/servers/bootstrap_defs.h for the error codes.
2012-01-21 03:00:53.208 open[816] CFLog (99): CFMessagePortCreateLocal(): failed to name Mach port (Processes-0.151912449) CFMessagePortCreateLocal failed (name = Processes-0.151912449 error = 0)
2012-01-21 03:01:00.100 open[818] CFLog (0): CFMessagePort: bootstrap_register(): failed 1100 (0x44c), port = 0x2203, name = 'Processes-0.152043521' See /usr/include/servers/bootstrap_defs.h for the error codes.
2012-01-21 03:01:00.101 open[818] CFLog (99): CFMessagePortCreateLocal(): failed to name Mach port (Processes-0.152043521) CFMessagePortCreateLocal failed (name = Processes-.152043521 error = 0)
Помощь очень ценится не только потому, что мне это нужно для работы, но и потому, что головоломка сводит меня с ума.