Как запустить сервер node.js как процесс-демон?

85

В Python Twisted у вас есть twistdкоманда, которая помогает вам с рядом вещей, связанных с запуском вашего приложения (например, демонизировать его).

Как вы демонизируете сервер node.js, чтобы он мог работать даже после закрытия текущего сеанса?

Спасибо за вашу помощь

Джером ВАГНЕР
источник
1
См. Также stackoverflow.com/questions/4018154/…
Frosty Z

Ответы:

93

Forever - это ответ на ваш вопрос.

Установить

$ curl https://npmjs.org/install.sh | sh
$ npm install forever
# Or to install as a terminal command everywhere:
$ npm install -g forever

Применение

Использование Forever из командной строки

$ forever start server.js

Использование экземпляра Forever из Node.js

var forever = require('forever');

  var child = new forever.Forever('your-filename.js', {
    max: 3,
    silent: true,
    args: []
  });

  child.on('exit', this.callback);
  child.start();
Baggz
источник
7
Следует использовать параметр -g для глобальной установки. Для этого могут потребоваться разрешения.
refaelio
1
что происходит при перезагрузке?
1
@AlexBrown - вам нужно добавить forever start server.jsв сценарий запуска (например rc.local), если вы хотите, чтобы он пережил перезагрузки.
UpTheCreek
3
В конце концов я решил использовать monit для запуска и остановки процесса навсегда.
9
навсегда мертв, pm2 - новый король. Пожалуйста, не тратьте время попусту. Я только что перешел, и я просто потрясен. pm2 может сбалансировать загрузку вашего приложения на всех ядрах с помощью простого .. pm2 start app.js -i 0 --name "myapp" ... ВАУ ... попробуйте, и вы не будете вечно оглядываться ... см. @ Ответ Гэри Берница
danday74
45

Если вам нужно, чтобы ваш процесс демонизировал себя, а не ретранслировал его вечно, вы можете использовать модуль daemonize .

$ npm install daemonize2

Затем просто напишите свой серверный файл, как в примере:

var daemon = require("daemonize2").setup({
    main: "app.js",
    name: "sampleapp",
    pidfile: "sampleapp.pid"
});

switch (process.argv[2]) {

    case "start":
        daemon.start();
        break;

    case "stop":
        daemon.stop();
        break;

    default:
        console.log("Usage: [start|stop]");
}

Имейте в виду, это довольно низкоуровневый подход.

Budleigh
источник
2
Это звучит как более правильный ответ на вопрос «как запустить сервер node.js в качестве демона».
Шьям Хабаракада
2
Что вы вкладываете в app.js? Для меня это просто выходит сразу.
chovy
2
Что происходит при перезагрузке?
mixdev
case 'restart': daemon.on('stopped', () => { daemon.start(); }); daemon.stop(); break;
davidhq
23

Чтобы запустить systemdдемон диспетчера служб, напишите служебный файл. Например, создать файл /etc/systemd/system/myservice.service.

[Unit]
Description=myservice-description
After=network.target

[Service]
ExecStart=/opt/myservice-location/src/node/server.js --args=here
Restart=always
User=me
Group=group
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/opt/myservice-location

[Install]
WantedBy=multi-user.target

Не забывайте обновлять демон диспетчера служб после каждого изменения файла myservice.service.

$ systemctl daemon-reload

Затем запустите службу и разрешите запуск службы при загрузке.

$ systemctl start myservice
$ systemctl enable myservice
activedecay
источник
1
где вы помещаете дополнительные аргументы для server.js в этом случае?
Никита Фукс
19

ОБНОВЛЕНИЕ : я обновился, чтобы включить последнее от pm2:

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

https://github.com/unitech/pm2

http://pm2.io

  • у него есть действительно полезная функция мониторинга -> красивый графический интерфейс для мониторинга нескольких процессов из командной строки pm2 monitили списка процессов сpm2 list
  • организованное управление журналом -> pm2 logs
  • другие вещи:
    • Конфигурация поведения
    • Поддержка исходной карты
    • Совместимость с PaaS
    • Смотреть и перезагрузить
    • Модульная система
    • Максимальная перезагрузка памяти
    • Кластерный режим
    • Горячая перезагрузка
    • Рабочий процесс разработки
    • Сценарии запуска
    • Автозаполнение
    • Рабочий процесс развертывания
    • Мониторинг ключевых показателей
    • API
Хатч
источник
3
навсегда мертв, pm2 - король! Я использую вечно с тех пор, но только что переключился на pm2. ВОТ ЭТО ДА! ВОТ ЭТО ДА! ВОТ ЭТО ДА! навсегда запускает ваше приложение на 1 ядре, pm2 может делать то же самое ИЛИ он может балансировать нагрузку вашего приложения на всех доступных ядрах. ВОТ ЭТО ДА! нет необходимости в заданиях cron @reboot, просто выполните запуск pm2 (чтобы запустить pm2 как службу systemd или эквивалентную ОС), а затем сохраните pm2. теперь перезагрузитесь, и ваши приложения все еще работают. Вы можете получить статус запущенного приложения с помощью pm2 show. часы легко доступны. ВОТ ЭТО ДА! невероятное ВАУ!
danday74
Настройка pm2 для пользователя без полномочий root в openshift - слишком сложная задача.
karthik101
12

Самый простой подход - просто отправить команду в фоновый режим.

$ node server.js &

Затем вы можете убить процесс позже. Обычно я делаю следующее:

$ killall node

Примечание : я использую OS X.

рейд
источник
52
Обратите внимание, что это не сработает, если вы выйдете из сеанса терминала / ssh. Полное решение для этого - nohup node server.js> / dev / null 2> & 1 &
Майкл Диллон
@MichaelDillon Как вы думаете, почему перенаправление выходных данных /dev/nullдолжно быть включено в полное решение?
nurettin
8

Ты можешь попробовать:

$ nohup node server.js &

У меня это работает на Mac и Linux.

Результат будет в ./nohup.outфайле

Но я все же рекомендую вам использовать pm2или forever, потому что их легко использовать для перезапуска, остановки и регистрации.

полоса дороги
источник
3

Есть более продвинутые бегуны общего назначения, такие как monitи runit.

nponeccop
источник
0

Чтобы получить справочную информацию о обычном способе демонизации в системе POSIX, вы можете найти метод C.

Я не видел достаточно методов в API node.js, чтобы это можно было сделать вручную на языке C. Однако при использовании child_process вы можете сделать это за вас с помощью node.js:

http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

Я считаю это потенциальной тратой времени, потому что есть большая вероятность, что ваша система предоставляет то же самое.

Например:

http://libslack.org/daemon/manpages/daemon.1.html

Если вам нужно что-то портативное (кроссплатформенное), другие сообщения предлагают решения, которых может хватить.

jgmjgm
источник