OS X: LaunchDaemon не работает: служба не может инициализировать

Я использовал Apple, казалось бы, простые документы , чтобы создать LaunchDaemon для запуска сценария Node.js, который я написал.

Вот файл plist. В основном это копия-копия документов Apple, настроенная на запуск каждые 300 секунд:

<?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.wintr.eodemail</string>
    <key>ProgramArguments</key>
    <array>
        <string>~/projects/eod_email/eod</string>
    </array>
    <key>StartInterval</key>
    <integer>300</integer>
<key>StandardOutPath</key>
    <string>/var/log/eod-email.log</string>
    <key>StandardErrorPath</key>
    <string>/var/log/eod-email.log</string>
    <key>Debug</key>
    <true/>
</dict>
</plist>

Вот ошибка, которую я получаю в /var/log/system.log:

Jul 22 10:55:52 Nick-Cox com.apple.xpc.launchd[1] (com.wintr.eodemail[7097]): Service could not initialize: 14E46: xpcproxy + 13421 [1402][7D917364-B96E-3F93-B923-A89B5BF5736D]: 0x2

Что я сделал:

  • Он имеет те же права, что и остальные файлы в /Library /LaunchDaemons (-rw-r--r--, принадлежащие root)
  • Я прочитал docs для xpc , но это мало помогло.
  • Я убедился, что сценарий Node.js был достаточно разрешительным (777) и запускался из командной строки (это).
  • Пробовал абсолютный путь к файлу (/Users/nickcox/projects/eod_email/eod) и удостоверился, что я запустил launchctl unload (daemonname) и launchctl load (daemon name)

Это кажется гораздо более сложным, чем cron, который, по-видимому, устарел, согласно данным Apple. Что мне нужно сделать, чтобы запустить этот сценарий по расписанию?

7 голосов | спросил nickcoxdotme 22 J000000Wednesday15 2015, 21:02:13

2 ответа


5

Начало работы с launchctll может определенно быть разочаровывающим опытом. Я нашел много статей, объясняющих, что вы должны делать, но мало загружаемых образцов. Вот простой LaunchDaemon, который, мы надеемся, станет хорошей отправной точкой. Вы можете просто скачать файлы здесь , если вы этого не сделаете чувствуйте себя как копирование и вставка.

Примечание: вам нужно заменить MY_USER_NAME своим именем пользователя. Плис должен найти ваш скрипт.

// at ~/Desktop/testdaemon/com.wintr.eodemail.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.wintr.eodemail</string>
    <key>Program</key>
    <string>/Users/MY_USER_NAME/Desktop/testdaemon/testdaemon.sh</string>
    <key>StandardErrorPath</key>
    <string>/var/log/eod-email.log</string>
    <key>StandardOutPath</key>
    <string>/var/log/eod-email.log</string>
    <key>RunAtLoad</key>
    <true/>
    <key>StartInterval</key>
    <integer>15</integer>
</dict>
</plist>

Это простой сценарий демона, который добавит дату и время к файлу на вашем рабочем столе. Примечание: поскольку сценарий запускается с правами root, тильда (~) не будет домашним каталогом, который вы ожидаете.

// at ~/Desktop/testdaemon/testdaemon.sh
#!/bin/sh
home="/Users/MYUSERNAME" ## note -- this will be run as root, ~ is not your normal user
now=$(date "+%Y-%m-%d %H.%M.%S")
echo $now >> "$home/Desktop/TestFile.txt"

Наконец, я всегда пишу небольшой сценарий оболочки для установки LaunchDaemons, так как легко ошибиться. Так как launchctl запускает ваш скрипт как root, он требует, чтобы разрешения сценария не могли быть записаны другими, поскольку это по существу предоставило бы им привилегии root.

// ~/Desktop/testdaemon/install.sh
#!/bin/sh -e
plist_path="com.wintr.eodemail.plist"
plist_filename=$(basename "$plist_path")
install_path="/Library/LaunchDaemons/$plist_filename"

echo "installing launchctl plist: $plist_path --> $install_path"
sudo cp -f "$plist_path" "$install_path"
sudo chown root "$install_path"
sudo chmod 644 "$install_path"

sudo launchctl unload "$install_path"
sudo launchctl load "$install_path"

echo "to check if it's running, run this command: sudo launchctl list | grep wintr"
echo "to uninstall, run this command: sudo launchctl unload \"$install_path\""
ответил zekel 16 +03002015-10-16T20:01:14+03:00312015bEurope/MoscowFri, 16 Oct 2015 20:01:14 +0300 2015, 20:01:14
-1

Это поможет, если вы можете вставить вывод launchctl list | grep 'com.wintr.eodemail'.

Кроме того, проверьте ваш файл /var/log/eod-email.log. Это может дать вам точные ошибки.

Я рекомендую установить brew cask install launchcontrol, который является инструментом gui для launchctll, он может помочь обнаружить ошибки и проблемы при съемке.

ответил Promod 22 +03002018-10-22T12:54:15+03:00312018bEurope/MoscowMon, 22 Oct 2018 12:54:15 +0300 2018, 12:54:15

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132