Как я могу отладить Launchd script, который не запускается при запуске?

У меня есть сценарии 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>

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

Ответ 1

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

<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: В моем случае создание простой оболочки для оболочки script работало еще лучше. Этот script устанавливает базовую структуру папок, чтобы сделать оболочку script в OS X "app" - https://gist.github.com/mathiasbynens/674099. Это может работать лучше для вашей команды mysql -u arg1.

Ответ 2

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

/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

Ответ 3

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

launchctl start com.myfile.hostname.plist

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

launchctl stop com.myfile.hostname.plist

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

launchctl load ~/Library/LaunchAgents/com.myfile.hostname.plist

Ответ 4

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

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

и раздел Ярлык в plist:

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

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

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

Ответ 5

Для меня другие решения пока что мне не помогают. Моя проблема довольно сложна для отладки, потому что файл 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 в начале сценария оболочки. Потому что мне лень добавлять эту строку иногда.

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

Ответ 6

Ответ на это для будущих гуглеров

Команда, которую вы ищете,

sudo tail -F /var/log/system.log | grep --line-buffered \
"com.apple.launchd\[" | grep "com.example.app"

Если это не поможет при отладке, просто добавьте ключи StandardOutPath или StandardErrorPath в ваш *.plit файл и проверьте журналы:

<key>StandardOutPath</key> 
<string>/tmp/test.stdout</string>
<key>StandardErrorPath</key> 
<string>/tmp/test.stderr</string>

Отметьте http://www.launchd.info/

Предоставляет всю необходимую информацию, относящуюся к Конфигурация/Устранение неполадок, связанных с запуском.