Не удалось запустить запущенный 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.

Другие вопросы по тегам