1

Я использую Mac OS X 10.10.5 (Yosemite) для обучения использованию launchd (Launch Daemon) для автоматического запуска некоторых скриптов. Для простоты я решил использовать скрипт shell который содержит только команду echo .

Содержимое hello.sh:

#! /bin/sh
echo "hello"

Также я запустил chmod a+x hello.sh чтобы сделать его исполняемым, и когда я запускаю скрипт вручную, он работает нормально.

В ~/Library/LaunchAgents/ меня есть com.yang.hello.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.yang.hello</string>
        <key>Program</key>
        <string>/Users/yangyy/hello.sh</string>
        <key>RunAtLoad</key>
        <true/>
    </dict>
</plist>

После того, как я бегу:

launchctl load -w ~/Library/LaunchAgents/com.yang.hello.plist

Сообщение об ошибке не появляется, и если я запускаю эту команду:

launchctl list | grep "com.yang.hello"

Я получаю ответ:

-   78  com.yang.hello.plist

Кажется, что положительное число указывает на код завершения, и программа фактически не работает.

Кроме того, я нахожу что-то странное, когда я пытался использовать launchctl start ~/Library/LaunchAgents/com.yang.hello.plist для запуска программы, но когда я использую эту команду, она возвращает ошибку и сообщение об ошибке отсутствует.

В чем дело?

2 ответа2

1

Я не знаю, что означает состояние выхода 78, но я не ожидал бы, что этот скрипт будет делать что-то обнаруживаемое при запуске в качестве агента запуска, потому что его выходные данные никуда не направлены. Когда вы запускаете его из Терминала, его вывод присоединяется к окну Терминала, так что там появляется "привет". Но launchd не имеет связи с Терминалом (или любой другой релевантной выходной целью), поэтому "привет" отбрасывается. Если вы хотите проверить, работает ли он, вы можете направить его выходные данные (как стандартный вывод, так и вывод ошибок) в файлы, добавив эти ключи в .plist (а затем выгрузив и перезагрузив его):

<key>StandardOutPath</key>
<string>/Users/yangyy/hello-output.txt</string>
<key>StandardErrorPath</key>
<string>/Users/yangyy/hello-errors.txt</string>

Теперь также возможно, что у launchd возникли другие проблемы, даже при запуске скрипта. Чтобы узнать, сообщает ли launchd о каких-либо проблемах, посмотрите файл системного журнала (tail -f /var/log/system.log или запустите /Applications/Utilities/Console.app), затем попробуйте выгрузить + перезагрузить агент и увидеть если что-нибудь важное появляется в журнале.

0

Тогда номер, который вы видите в launchctl list - это код состояния, который демон-процесс выдал при выходе.

Итак, хорошая новость в том, что процесс запущен.

Статус 78 - это общий код выхода, поэтому плохая новость в том, что он мало что нам говорит.

Не помогает вашей точной проблемы, но, возможно, проливает свет на то, что происходит.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .