Назад | Перейти на главную страницу

головоломка с расписанием launchd

Вот загадка: у меня есть .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)

Помощь очень ценится не только потому, что мне это нужно для работы, но и потому, что головоломка сводит меня с ума.