OSX launchd plist для процесса node навсегда

Я пытаюсь написать файл launchd.plist для своего сервера узлов. Я использую вечность для запуска своего сервера узлов. Я хочу, чтобы сервер запускался при загрузке. Я также хотел бы дождаться запуска mongodb launchd plist первым.

Я установил mongobb с помощью homebrew, и у него уже есть launchd.plist. Я выполнил следующее:

$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist

plist для mongodb:

<!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>homebrew.mxcl.mongodb</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/opt/mongodb/mongod</string>
    <string>run</string>
    <string>--config</string>
    <string>/usr/local/etc/mongod.conf</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>KeepAlive</key>
  <false/>
  <key>WorkingDirectory</key>
  <string>/usr/local</string>
  <key>StandardErrorPath</key>
  <string>/usr/local/var/log/mongodb/output.log</string>
  <key>StandardOutPath</key>
  <string>/usr/local/var/log/mongodb/output.log</string>
  <key>HardResourceLimits</key>
  <dict>
    <key>NumberOfFiles</key>
    <integer>1024</integer>
  </dict>
  <key>SoftResourceLimits</key>
  <dict>
    <key>NumberOfFiles</key>
    <integer>1024</integer>
  </dict>
</dict>
</plist>

Если я выключаю компьютер и перезапускаю, mongodb запускается должным образом.

Однако мой сервер узла не запускается. Любые идеи?

<?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>
        <dict>
            <key>SuccessfulExit</key>
            <false/>
        </dict>
        <key>Label</key>
        <string>com.test.app</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/local/bin/forever</string>
            <string>-a</string>
            <string>-l</string>
            <string>/var/log/app/app.log</string>
            <string>-e</string>
            <string>/var/log/app/app_error.log</string>
            <string>/data/server/app.js</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StartInterval</key>
        <integer>3600</integer>
    </dict>
</plist>

РЕДАКТИРОВАТЬ:

запись в файл журнала, и я вижу это:

env: node: нет такого файла или каталога

Я думаю, это означает, что двоичный файл узла не может быть найден. Я могу повторить $ PATH и / usr / local / bin на моем пути. Я могу запустить узел с терминала. Идеи?


person lostintranslation    schedule 04.09.2013    source источник


Ответы (5)


Добавление переменных среды сработало для меня.

<key>EnvironmentVariables</key>
<dict>
  <key>PATH</key>
  <string>/usr/local/bin/:$PATH</string>
</dict>

Вам также может потребоваться добавить WorkingDirectory в ваше приложение узла.

<key>WorkingDirectory</key>
<string>path/to/your/node/app</string>
person frnkxiao    schedule 15.10.2014
comment
решил мои проблемы, пытаясь запустить bash -c node index.js - person terrace; 01.05.2015

У меня тоже была эта проблема, но я решил ее с помощью приложения Automator, которое запускается при запуске.

  1. Откройте Automator и выберите New Application.

  2. Вставьте в рабочий процесс «Запуск сценария оболочки»

  3. Используйте этот код в сценарии оболочки, изменив пути на свои пути

export PATH=/usr/local/bin/:$PATH
cd /path/to/your/nodejs/app
forever start app.js
  1. Перейдите в Системные настройки >> Пользователи и группы и щелкните вкладку Элементы входа.

  2. Добавьте свое приложение Automator и будьте счастливы.

Важной частью решения является первая строка сценария (добавление корзины к пути). Вероятно, сработает добавить элемент запуска, указывающий также на сценарий bash (а не на сценарий Automator), не стесняйтесь попробовать!

person eutobias    schedule 17.10.2013
comment
После попытки запуска демонов, /etc/rc.common и всего остального, что я смог найти, этот Automator .app - лучший способ добиться этого. - person Dimitris; 16.12.2014

Добавить узел раньше навсегда:

<key>ProgramArguments</key>
<array>
    <string>/usr/local/bin/node</string>
    <string>/usr/local/bin/forever</string>
    <string>/path/to/app.js</string>
</array>
person zobier    schedule 11.09.2013
comment
Это работает не так, как ожидалось. Хотя он запустится app.js, вы не сможете увидеть его работающим вечно ни с sudo forever list, ни с forever list. - person jczaplew; 03.06.2014
comment
вам нужно вставить ‹string› start ‹/string› перед app.js strong, тогда вы сможете перечислить все запущенные приложения node ... - person ; 03.10.2016

Это не ответ на исходные вопросы, но я искал простой способ запустить сервер узла (и сохранить его работающим) после перезагрузки. Я обнаружил, что pm2 гораздо проще настроить, чем решения для навсегда выше.

# install pm2
npm install pm2 -g

# start server
pm2 start app.js

# start pm2 after reboot (might need sudo)
$ pm2 startup

http://pm2.keymetrics.io/docs/usage/startup/

person gregers    schedule 04.12.2016

Я не уверен, когда вышел node-launchd. Однако это кажется более надежным решением.

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

person 梁國淦    schedule 05.05.2015