Закрываем окно удаленного терминала без закрытия программ (часть 2, для скриптов NodeJS)
Некоторе время назад у меня появилась необходимость много работать со скриптами, написанными под NodeJS, и почти сразу передо мной встал вопрос об организации работы моих приложений. В частности, понадобилось чтобы после запуска приложение висело в фоне, не закрывалось после закрытия удаленного терминала, а если оно работает на "боевом" сервере, то ещё и чтобы перезапускалось, если вдруг упадёт.
Сразу я почему-то не додумалась поискать готовое решение и поэтому пользовалась командой disown в Linux чтобы запустить приложение и при этом не занимать терминал, то есть можно будет дальше выполнять другие команды, или вообще закрыть консоль/терминал и отключиться от удаленки.
Потом я наткнулась на утилиту forever. Она есть в npm и соответственно установить этот пакет можно командой
npm i forever -g (разумеется у вас на компьютере уже должен быть установлен движок NodeJS)
Тут всё достаточно просто:
forever start main.js # запуск приложения
forever restart main.js # перезапуск приложения
forever stop main.js # остановка приложения
forever list # посмотреть список запущенных приложений
forever restartall # перезапуск всех приложений
forever stopall # остановка всех приложений
Но с forever у меня возникли затруднения при запуске нескольких приложений одновременно, и некоторое время пришлось поработать, обернув эту утилиту в небольшой bash-скрипт для удобного запуска отдельных приложений, что с другой стороны лишило меня возможности остановки и выгрузки приложений без перезагрузки компьютера.
И, наконец, всего пару дней назад, @denis-skripnik показал мне ещё одну утилиту для управления приложениями - менеджер приложений pm2. Она также есть в npm и установить можно командой:
npm i pm2 -g
pm2 предоставляет более обширные возможности управления приложениями (включая фоновые).
Запускается приложение вот так:
pm2 start main.js --name same-name, где main.js - скрипт, который вам необходимо запустить.
Параметр --name нужно указывать для того случая, если вам надо одновременно запустить из разных папок несколько скриптов с одинаковыми именами, чтобы система могла как-то различать процессы.
Ну и разумеется, если работа вашего скрипта предполагает внесение каких-то изменений на дисках, к примеру создание каких-то файлов, баз данных, перезапись информации итд - приложение следует запускать с админскими правами, то есть либо из-под root, или так:
sudo pm2 start main.js --name same-name
Вот так можно посмотреть списки запущенных приложений:
sudo pm2 list
Результат введения команды - единовременный вывод на экран таблицы с запущенными приложениями, в моем случае сейчас запущено когда-то очень известное в узких кругах на Голосе приложение ost.js =)
А команда sudo pm2 monit позволяет нам отслеживать состояние приложений в режиме реального времени. Что-то вроде утилиты htop, только для pm2.
В правом верхнем окне - это консоль приложения, в которой можно видеть как оно работает и какие результаты выдает на экран.
Можно остановить приложение^
sudo pm2 stop same-name
...и в листинге будет указано, что оно в данный момент остановлено:
И запустить обратно:
sudo pm2 start same-name
А чтобы убрать его из списка, и выгрузить полностью из системы, нужно выполнить:
sudo pm2 delete same-name
И теперь мы видим что в нашем менеджере пусто и никакие приложения не выполняются
(как видно на скрине, у меня в данный момент сервак запущен под рутом, поэтому я не использую sudo, но вы должны будете)
Также, pm2 поддерживает автозапуск и авторестарт приложений, у него есть API для написания своих скриптов, ещё он поддерживает кластеризацию в NodeJS и даже запуск приложений на других языках: php, ruby, python, sh, cofee. Подробнее можно прочитать на официальной страничке менеджера.
Но это уже немного выходит за рамки текущей статьи и если вам будет интересно, то может быть когда-то я напишу об этом, но только после того, как освою программирование на этих языках =).