Не удается запустить запуск в Mac OS X

2939
Jinglei.Y

Я использую 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для запуска программы, но когда я использую эту команду, она возвращает ошибку, а сообщения об ошибке нет.

В чем дело?

1

2 ответа на вопрос

1
Gordon Davisson

Я не знаю, что означает состояние выхода 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), затем попробуйте выгрузить + перезагрузить агент и посмотреть, появляется ли что-либо соответствующее в журнале.

Это помогает, потому что в выходном файле есть «привет». Я думал, что это покажет только в терминале. Благодарю. Jinglei.Y 7 лет назад 0
0
Dan Bergh Johnsson

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

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

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

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