Не удалось запустить запущенный plist в Mac OS X
Я использую 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
чтобы запустить программу, но когда я использую эту команду, она возвращает ошибку и сообщение об ошибке отсутствует.
В чем дело?
6 ответов
Я не знаю, что означает состояние выхода 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), затем попытайтесь выгрузить + перезагрузить агент и посмотреть, появляется ли что-либо соответствующее в журнале.
Тогда номер, который вы видите в launchctl list
это код состояния, который демон-процесс выдал при выходе.
Итак, хорошая новость в том, что процесс запущен.
Статус 78 - это общий код выхода, поэтому плохая новость в том, что он мало что нам говорит.
Не помогает вашей точной проблемы, но, возможно, проливает некоторый свет на то, что происходит.
В строке метки com.yang.hello**.plist** отсутствует суффикс.
Попробуйте ProgramArguments вместо Program и используйте двухстрочное объявление: сначала объявите путь к оболочке bash, а затем установите свой скрипт. Обязательно определите рабочий каталог с помощью WorkDirectory.
Например, часть моего списка:
<key>WorkingDirectory</key>
<string>/Users/royalcrown/Library/AutoBackup</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>scriptRC.sh</string>
</array>
Эта ошибка для меня была вызвана некоторой проблемой разрешения, вызванной моим указанием StandardOutPath
а также StandardErrPath
чья (та же самая) последняя папка не существует. Загрузка plist создала папку, но без предоставления пользователю каких-либо разрешений на нее. Я chmod'ed, но все еще получил код ошибки 78 и ничего не регистрировалось ни в один файл журнала. Я также не видел никаких ошибок в Console.app.
Я решил проблему, выгрузив plist, удалив автоматически созданную папку, заново создав ее, а затем перезагрузив plist. Демон теперь работает правильно, а логи пишутся как положено.
/questions/65861/ne-udalos-zapustit-zapuschennyij-plist-v-mac-os-x/1027006#1027006 — правильное решение. Я столкнулся с той же проблемой с кодом выхода 78. Оказывается, владельцем автоматически созданной папки журнала являетсяroot
, и скрипт не может создать в нем файл журнала.
Просто удалите автоматически создаваемую папку журнала и создайте ее вручную, и проблема будет решена.
Как ни странно, я решил проблему, выполнив противоположное решению mrwnt10: /questions/65861/ne-udalos-zapustit-zapuschennyij-plist-v-mac-os-x/1027006#1027006 . Я создал файл out.log вручную с помощью chmod a+w, а затем загрузил свой plist, что привело к ошибке 78. Но, удалив созданный вручную файл out.log, выгрузив, а затем загрузив plist, файл out.log был автоматически создается и успешно записывается.
Это было сделано на macOS Big Sur v11.1.