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

Сразу не додумался поискать готовое решение и поэтому пользовался командой disown в Linux. Вот так вот можно запустить приложение и при этом не занимать терминал, то есть можно будет дальше выполнять другие команды.
Но проблема в том, что после закрытия терминала/ssh-сессии приложение падает. Чтобы отвязать его от текущего сеанса и отправить в свободное плавание, существует команда disown. И теперь запуск приложения будет выглядеть так.
Подробнее об использовании этой команды можно посмотреть, например, тут.
Потом я наткнулся на утилиту forever. Она есть в npm и соответственно установить можно командой
Тут всё достаточно просто:
Подробнее о возможностях утилиты можно посмотреть здесь. Мне же пришлось обернуть эту утилиту в небольшой bash-скрипт, для удобного запуска отдельных приложений.
И, наконец, совсем недавно я нашёл ещё одну утилиту для демонизации — pm2. Она так же есть d npm и установить можно командой:
pm2 предоставляет более обширные возможности.
Запускается приложение вот так:
Параметр --name нужно указывать для того случая, если у вас исполняемые файлы у разных одинаково называются, чтобы как-то различать процессы. Кстаи в forever это можно было делать только по пути к файлу.
Вот так можно посмотреть списки запущенных приложений:
Результат первой команды это единовременный вывод в конcоль таблицы с запущенными приложениями.

А второй это мониторинг за состонием приложений в режиме реального времени. Что-то вроде top или htop.

Вот так:
Можно остановить приложение и в листинге будет указано, что оно остановлено.

Но его всё ещё можно запустить обратно:
Чтобы убрать его из списка, нужно выполнить:
И останется только:

Так же pm2 поддерживает автозапуск приложений, у него есть API для написания своих скриптов, ещё он поддерживает кластеризацию в NodeJS и даже запуск приложений на других языках: php, ruby, python, sh, cofee. Подробнее здесь. Но это уже немного выходит за рамки текущей статьи и если будет интересно, то я напишу отдельно о работе с pm2.
Сразу не додумался поискать готовое решение и поэтому пользовался командой disown в Linux. Вот так вот можно запустить приложение и при этом не занимать терминал, то есть можно будет дальше выполнять другие команды.
node main.js &
Но проблема в том, что после закрытия терминала/ssh-сессии приложение падает. Чтобы отвязать его от текущего сеанса и отправить в свободное плавание, существует команда disown. И теперь запуск приложения будет выглядеть так.
node index.js & disown %1
Подробнее об использовании этой команды можно посмотреть, например, тут.
Потом я наткнулся на утилиту forever. Она есть в npm и соответственно установить можно командой
npm i forever -g # не понимаю, почему никто не использует алиас i для install
Тут всё достаточно просто:
forever start main.js # запуск приложения
forever restart main.js # перезапуск приложения
forever stop main.js # остановка приложения
forever list # посмотреть список запущенных приложений
forever restartall # перезапуск всех приложений
forever stopall # остановка всех приложений
Подробнее о возможностях утилиты можно посмотреть здесь. Мне же пришлось обернуть эту утилиту в небольшой bash-скрипт, для удобного запуска отдельных приложений.
И, наконец, совсем недавно я нашёл ещё одну утилиту для демонизации — pm2. Она так же есть d npm и установить можно командой:
npm i pm2 -g
pm2 предоставляет более обширные возможности.
Запускается приложение вот так:
pm2 start main.js --name same-name
Параметр --name нужно указывать для того случая, если у вас исполняемые файлы у разных одинаково называются, чтобы как-то различать процессы. Кстаи в forever это можно было делать только по пути к файлу.
Вот так можно посмотреть списки запущенных приложений:
pm2 list
pm2 monit
Результат первой команды это единовременный вывод в конcоль таблицы с запущенными приложениями.

А второй это мониторинг за состонием приложений в режиме реального времени. Что-то вроде top или htop.

Вот так:
pm2 stop same-name
Можно остановить приложение и в листинге будет указано, что оно остановлено.

Но его всё ещё можно запустить обратно:
pm2 start same-name
Чтобы убрать его из списка, нужно выполнить:
pm2 delete same-name
И останется только:

Так же pm2 поддерживает автозапуск приложений, у него есть API для написания своих скриптов, ещё он поддерживает кластеризацию в NodeJS и даже запуск приложений на других языках: php, ruby, python, sh, cofee. Подробнее здесь. Но это уже немного выходит за рамки текущей статьи и если будет интересно, то я напишу отдельно о работе с pm2.