22

Дали пробную неделю на VPS хостинг, поставил там NodeJS, но проблема в том, что он работает, только тогда, когда активирована консоль. Как сделать, чтобы он работал бесконечно?

6 ответов 6

19

С момента последнего ответа прошло уже три года. Node.js существенно "повзрослел" за это время, так что вопрос не потерял своей актуальности.

Думаю стоит упомянуть еще несколько вариантов, которые отсутствуют в других ответах.

Forever

В экосистеме Node.js существует пакет forever. Его можно использовать как порождающего демона для вашего приложения. Из плюсов этого решения можно отметить простоту и возможность не писать дополнительный код. Кроме того, можно настроить forever так, чтобы он автоматически перезапускал приложение при его падении. Из минусов -- необходимость тащить в систему node.js скрипт-демон, который нужно устанавливать глобально. В ряде случаев это может оказаться неприемлемым. Запуск приложения, с использованием этого решения выглядит так:

forever start app.js

а его остановка:

forever stop app.js

PM2

Другим популярным решением из экосистемы Node.js является менеджер процессов PM2. Как и в случае с forever, pm2 это глобальный установленный node.js процесс-демон (со всеми плюсами и минусами). После его установки запуск приложения осуществляется командой:

pm2 start app.js

а его остановка:

pm2 stop app.js

init.d

Можно написать обычный init.d скрипт для вашего приложения. Этот путь используют все нормальные службы Linux. Если говорить о плюсах этого решения, то ваше приложение будет запускаться и останавливаться самой системой, нет необходимости устанавливать лишний процесс демон. Из минусов -- вам перезапускать приложение при падении в ручную (или с помощью специальных утилит). Так же вам придется написать сам init.d скрипт. За основу можно взять, например, вот это решение. Запуск приложения, с использованием этого решения выглядит так

service app-service-name start

а его остановка

service app-service-name stop
13

Вводите команду так (без <>):

nohup <команда> &

Завершение:

ps -e -o pid,args --forest

Ищите pid (Цифры) напротив вашего процесса, и вводите (без <>):

kill -TERM <pid вашего процесса>
6
  • 2
    @Zow, да, всё правильно, Node.js запустился в фоновом режиме, поэтому, игнорирует ввод и весь его вывод сохраняется в файле nohup.out, в директории с Node.js 28 авг 2012 в 8:23
  • 2
    @niki-timofе, да все я теперь понял. Я просто запускал с винды через putty, с Убунты все ок
    – Zow
    28 авг 2012 в 8:35
  • 2
    @niki-timofе, а как теперь отключить этот процесс ?
    – Zow
    28 авг 2012 в 8:38
  • 2
    @Zow, написал в ответе. 28 авг 2012 в 13:34
  • 2
    @niki-timofе, а как перезагрузить )))
    – Zow
    29 авг 2012 в 8:56
6

Все предыдущие ответы очень смахивают на временное решение. Чтобы сделать всё основательно, вам нужно превратить node.js в полноценного демона. Для этого существует набор утилит daemontools (не путать с Windows-утилитой для монтирования CD-образов). По сравнению со временными вариантами демон имеет как минимум одно преимущество. Если в ваше отсутствие node.js завалится, то специальный супервайзер сразу это обнаружит и мгновенно его переподнимет.

7
  • 1
    @Shamov после установки можно работать через nohup?
    – Zow
    31 авг 2012 в 7:33
  • @Zow Можно, но не нужно. Для управления демоном есть специальные команды.
    – Shamov
    31 авг 2012 в 7:36
  • 1
    Другой вариант — написать init-скрипт, на манер такого: https://gist.github.com/715255. А задачу мониторинга отдать, например, monit'у.
    – drdaeman
    31 авг 2012 в 14:36
  • @Shamov, а есть руководство или примеры специальных команд, тока не на английском. Если нет то могли бы вы написать как запустить и остановить процесс?
    – Zow
    31 авг 2012 в 14:57
  • 1
    @Shamov, админы установили, но тоже не шарят, как с ним работать. Скажи плиз как запускать и останавливать процесс. hashcode.ru/questions/142176
    – Zow
    31 авг 2012 в 17:15
4

Так-же можно воспользоваться утилитой start-stop-daemon.

Запуск:

start-stop-daemon -Sbm -p /var/run/nodejs.pid -x node -- some.js

Остановка:

start-stop-daemon -K -p /var/run/nodejs.pid
3

Выполнить команду screen. При этом откроется уже независимая консоль от ssh соединения.

Чтобы перейти к запущенному ранее скрину, надо выполнить screen -r

1

Еще 1 вариант - использовать systemd, если он есть в вашей системе. Создаем файлик /usr/lib/systemd/system/[имя_сервиса].service Далее в него помещаем конфиг:

[Service]
ExecStart=[node binary] [main file]
Restart=always
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=node-sample
User=srv-node-sample
Group=srv-node-sample
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target

После этого сделайте симлинк на него:

ln -s /usr/lib/systemd/system/[имя_сервиса].service     /etc/systemd/system/multi-user.target.wants/[имя_сервиса].service`

Перезагрузите systemctl:

systemctl daemon-reload`

И запустите свой сервис:

systemctl enable [имя_сервиса].service
systemctl start [имя_сервиса].service

Как бонус смотреть логи приложения:

journalctl -u [имя_сервиса]
0

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.