Как я могу отладить скрипт Launchd, который не запускается при запуске? - PullRequest
17 голосов
/ 14 июня 2011

У меня есть несколько скриптов Launchd от homebrew. Однако я должен вручную запустить их при перезагрузке компьютера:

launchctl load -w ~/Library/LaunchAgents/com.mysql.mysqld.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>KeepAlive</key>
  <true/>
  <key>Label</key>
  <string>com.mysql.mysqld</string>
  <key>Program</key>
  <string>/Users/dash/.local/Cellar/mysql/5.1.49/bin/mysqld_safe</string>
  <key>RunAtLoad</key>
  <true/>
  <key>UserName</key>
  <string>dash</string>
  <key>WorkingDirectory</key>
  <string>/Users/dash/.local/var</string>
</dict>
</plist>

Я думал, что это должно произойти при запуске. Чего мне не хватает?

Ответы [ 5 ]

23 голосов
/ 28 апреля 2015

Лучший способ, который я нашел для отладки, в вашем списке:

<key>StandardErrorPath</key>
<string>/tmp/mycommand.err</string>
<key>StandardOutPath</key>
<string>/tmp/mycommand.out</string>

Откройте консольное приложение, в «Все сообщения» вы должны увидеть записи, когда ваше приложение не работает или успешно. Как это:

4/28/15 10:43:19.938 AM com.apple.xpc.launchd[1]: (mycommand[18704]) Service exited with abnormal code: 1

Проблема, с которой я столкнулся в ProgramArguments, принимает каждый элемент команды как <string> элемент в массиве.

EDIT: В моем случае создание простой оболочки для сценария оболочки работало еще лучше. Этот сценарий устанавливает базовую структуру папок для превращения сценария оболочки в «приложение» OS X - https://gist.github.com/mathiasbynens/674099. Это может работать лучше для вашей команды mysql -u arg1.

2 голосов
/ 31 июля 2011

Одна возможность: загляните в каталог:

/private/var/db/launchd.db/

и найдите файл "com.apple.launchd.peruser. ###" для своего пользователя.Откройте его и посмотрите, есть ли запись типа:

<key>com.mysql.mysqld.plist</key>
<dict>
    <key>Disabled</key>
    <true/>
</dict>

Если это так, попробуйте установить ее на <false/>.Еще один файл для поиска того же:

/private/var/db/launchd.db/com.apple.launchd/overrides.plist
1 голос
/ 06 июля 2015

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

launchctl start com.myfile.hostname.plist

Чтобы остановиться, просто сделайте следующее ...

launchctl stop com.myfile.hostname.plist

Как только все тестирование будет завершено, вы выйдете из системы, затем загрузите его или, если ваш plist-файл находится в папке Library пользователя, введите следующее ...

launchctl load ~/Library/LaunchAgents/com.myfile.hostname.plist
0 голосов
/ 17 мая 2019

Для меня другие решения пока мне не помогают.Моя проблема довольно сложна для отладки, потому что файл plist правильный, скрипт работает нормально в терминале.Все выглядит хорошо, но не работает.

Я проверил файл журнала, выполнив

tail -f /var/log/system.log

А затем снова выгрузив и загрузив сервис с помощью команд:

launchctl unload ~/Library/LaunchAgents/example.plist
launchctl load ~/Library/LaunchAgents/example.plist

Я нашел сообщение об ошибке отфайл журнала:

Program specified by service is not a Mach-O executable file.

Что это на самом деле означает?Я не гуглил.Но я чувствую, что это потому, что я не добавил #!/bin/bash в начале сценария оболочки.Потому что мне лень добавлять эту строку иногда.

После добавления заголовка все работает нормально.

0 голосов
/ 31 июля 2011

Попробуйте переименовать его. Измените имя файла на:

~/Library/LaunchAgents/com.mysql.mysqld2.plist

и раздел Label в списке для:

<key>Label</key>
<string>com.mysql.mysqld2</string>

Если вы сохраняете резервную копию, обязательно переместите ее за пределы вашей ~ / Library / LaunchAgents / директории.

Наконец, вместо того, чтобы использовать launchctl для загрузки, просто выйдите из системы и снова войдите в систему. Это позволит launchd забрать его из вашего каталога "LaunchAgents" и удалить из смеси еще одну переменную (т.е. launchctl).

...