Я использую модуль навсегда узла, чтобы поддерживать работу моего сервера узла. Однако Forever прекращает работу при перезагрузке системы. Можно ли как-нибудь автоматически запустить сервер узла (с навсегда) при перезапуске системы?
Автоматически запускать навсегда (узел) при перезапуске системы
Ответы (15)
Я бы предложил использовать crontab. Его легко использовать.
Как
Чтобы начать редактирование, выполните следующую команду, заменив «testuser» на желаемого пользователя среды выполнения для процесса node. Если вы выберете другого пользователя, кроме себя, вам придется запускать это с помощью sudo.
$ crontab -u testuser -e
Если вы никогда не делали этого раньше, он спросит вас, в каком редакторе вы хотите редактировать. Мне нравится vim, но порекомендую nano из-за простоты использования.
В редакторе добавьте следующую строку:
@reboot /usr/local/bin/forever start /your/path/to/your/app.js
Сохраните файл. Вы должны получить сообщение о том, что cron установлен.
Для дальнейшего подтверждения установки cron выполните следующее (снова заменив «testuser» на ваше целевое имя пользователя), чтобы получить список установленных на данный момент cron:
$ crontab -u testuser -l
Обратите внимание, что, по моему мнению, вы всегда должны использовать полные пути при выполнении двоичных файлов в cron. Кроме того, если путь к вашему навсегда скрипту неверен, запустите which forever
, чтобы получить полный путь.
Учитывая, что forever
вызывает node
, вы также можете указать полный путь к node
:
@reboot /usr/local/bin/forever start -c /usr/local/bin/node /your/path/to/your/app.js
Дальнейшее чтение
@reboot
cron запускается на Демон cron запускается. Чтобы добавить, я никогда не сталкивался с ситуацией, которая предполагала бы, что мой cron, установленный на @reboot
, не запускается при загрузке системы. То, как вы его закрыли, не имеет значения для этого.
- person Julian Lannigan; 17.05.2013
@reboot
записей в мой crontab у меня не сработало; также не было тех же записей (минус @reboot
, конечно) в /etc/rc.local
. Так и есть, пока я не начал записи с /usr/bin/sudo -u {user}
. Поэтому я думаю, что шаг 1 следует изменить. Я протестировал эту форму как с вызовом /usr/bin/sudo
, так и без него; это работает только с: (cd /path/to/; /usr/bin/sudo -u myuser /usr/local/bin/forever start /path/to/app.js)
.
- person Arthur; 12.11.2013
-u
. Используя это, вы записываете / редактируете crontab для этого конкретного пользователя, и когда демон запускается, он будет обрабатывать все пользовательские crontab как их соответствующих пользователей.
- person Julian Lannigan; 25.11.2013
forever
! Прочитайте документы, потому что вы можете сделать все это с помощью одной команды. forever start /your/path/to/your/app.js
forever stop /your/path/to/your/app.js
forever restart /your/path/to/your/app.js
github.com/nodejitsu/
- person Julian Lannigan; 25.11.2013
/home
еще не смонтирован, поэтому это не сработает, если ваш код находится в /home
.
- person chovy; 24.12.2013
@reboot varname=value ...
- person lsborg; 28.09.2014
home
определенно смонтирован, но я не могу сказать то же самое, если использую ~
- person Eat at Joes; 07.03.2015
bin/www
для запуска службы, а bin/www
использует синтаксис #!/usr/bin/env node
, чтобы потребовать, чтобы node.js обрабатывал его, к сожалению, /usr/local/bin
не в загрузочном PATH, поэтому мое решение заключается в том, чтобы поместить следующую строку вверху моего файла crontab: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
чтобы расширить переменную PATH для корневых пользователей, это работает для меня
- person Hover Ruan; 02.08.2015
Для этого вы можете использовать сервис навсегда.
npm install -g forever-service
forever-service install test
Это предоставит app.js в текущем каталоге как услугу через навсегда. Служба будет автоматически перезапускаться при каждом перезапуске системы. Также при остановке он попытается изящно остановиться. Этот сценарий также обеспечивает сценарий logrotate.
URL-адрес Github: http://github.com/zapty/forever-service
ПРИМЕЧАНИЕ. Я являюсь автором навсегда службы.
forever-service install test
, test
будет именем службы, но не именем фактической программы/узла .js файла для запуска. По умолчанию предполагается, что имя программы app.js
, но вы можете переопределить его с помощью флага --script
следующим образом: forever-service install test --script main.js
. (Не проверено, поэтому, пожалуйста, поправьте меня, если есть неправильные детали синтаксиса.)
- person Dan Nissenbaum; 22.06.2015
Установите PM2 глобально с помощью NPM
npm install pm2 -g
Запустите свой скрипт с pm2
pm2 start app.js
создать активный сценарий запуска
pm2 startup
ПРИМЕЧАНИЕ. Запуск PM2 предназначен для запуска PM2 при перезагрузке системы. После запуска PM2 перезапускает все процессы, которыми он управлял до того, как система вышла из строя.
Если вы хотите отключить автоматический запуск, просто используйте pm2 unstartup.
Если вы хотите, чтобы сценарий запуска выполнялся под другим пользователем, просто используйте параметр -u <username>
и параметр --hp <user_home>:
.
Этот случай действителен для Debian.
Добавьте следующее в /etc/rc.local
/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}
{{user}}
заменяет ваше имя пользователя.{{app path}}
заменяет путь к вашему приложению. Например,/var/www/test/app.js
/etc/rc.local
, а не /etc/init.d/rc.local
- person UpTheCreek; 21.05.2013
app.js
, чтобы обеспечить правильную загрузку соответствующих файлов — process.chdir('/your/path/to/your/app');
Node.js ref docs здесь
- person So Over It; 07.06.2013
/etc/rc.local
помогло мне: ( cd /path/to/project && /usr/bin/sudo -u {{user}} env PORT={{port number}} PATH=$PATH:/usr/local/bin sh -c "forever start app.js" )
- person sffc; 27.12.2013
Альтернативный метод crontab, вдохновленный этим ответом и этот пост в блоге.
<сильный>1. Создайте файл сценария bash (замените bob на нужного пользователя).
vi /home/bob/node_server_init.sh
<сильный>2. Скопируйте и вставьте это в только что созданный файл.
#!/bin/sh
export NODE_ENV=production
export PATH=/usr/local/bin:$PATH
forever start /node/server/path/server.js > /dev/null
Обязательно отредактируйте указанные выше пути в соответствии с вашей конфигурацией!
<сильный>3. Убедитесь, что скрипт bash может быть выполнен.
chmod 700 /home/bob/node_server_init.sh
<сильный>4. Протестируйте сценарий bash.
sh /home/bob/node_server_init.sh
<сильный>5. Замените "bob" пользователем среды выполнения для узла.
crontab -u bob -e
<сильный>6. Скопируйте и вставьте (замените b на нужного пользователя).
@reboot /bin/sh /home/bob/node_server_init.sh
Сохраните кронтаб.
Вы дошли до конца, ваш приз — перезагрузка (для тестирования) :)
Скопированный ответ из прикрепленного вопроса .
Вы можете использовать PM2 — это диспетчер производственных процессов для приложений Node.js со встроенным балансировщиком нагрузки.
Установить PM2
$ npm install pm2 -g
Запустить приложение
$ pm2 start app.js
Если вы используете экспресс, вы можете запустить свое приложение, например
pm2 start ./bin/www --name="app"
Список всех запущенных процессов:
$ pm2 list
В нем будут перечислены все процессы. Затем вы можете остановить/перезапустить службу, используя идентификатор или имя приложения с помощью следующей команды.
$ pm2 stop all
$ pm2 stop 0
$ pm2 restart all
Отображение журналов
$ pm2 logs ['all'|app_name|app_id]
$pm2 startup
После этого вы увидите, что pm2 просит вручную запустить команду, скопировать и запустить ее. Затем $pm2 save
Теперь ваш app.js переживет перезагрузку системы.
- person yajnesh; 12.01.2018
Для этого вам нужно создать сценарий оболочки в папке /etc/init.d. Это довольно сложно, если вы никогда этого не делали, но в Интернете есть много информации о сценариях init.d.
Вот пример скрипта, который я создал для вечной работы сайта CoffeeScript:
#!/bin/bash
#
# initd-example Node init.d
#
# chkconfig: 345
# description: Script to start a coffee script application through forever
# processname: forever/coffeescript/node
# pidfile: /var/run/forever-initd-hectorcorrea.pid
# logfile: /var/run/forever-initd-hectorcorrea.log
#
# Based on a script posted by https://gist.github.com/jinze at https://gist.github.com/3748766
#
# Source function library.
. /lib/lsb/init-functions
pidFile=/var/run/forever-initd-hectorcorrea.pid
logFile=/var/run/forever-initd-hectorcorrea.log
sourceDir=/home/hectorlinux/website
coffeeFile=app.coffee
scriptId=$sourceDir/$coffeeFile
start() {
echo "Starting $scriptId"
# This is found in the library referenced at the top of the script
start_daemon
# Start our CoffeeScript app through forever
# Notice that we change the PATH because on reboot
# the PATH does not include the path to node.
# Launching forever or coffee with a full path
# does not work unless we set the PATH.
cd $sourceDir
PATH=/usr/local/bin:$PATH
NODE_ENV=production PORT=80 forever start --pidFile $pidFile -l $logFile -a -d --sourceDir $sourceDir/ -c coffee $coffeeFile
RETVAL=$?
}
restart() {
echo -n "Restarting $scriptId"
/usr/local/bin/forever restart $scriptId
RETVAL=$?
}
stop() {
echo -n "Shutting down $scriptId"
/usr/local/bin/forever stop $scriptId
RETVAL=$?
}
status() {
echo -n "Status $scriptId"
/usr/local/bin/forever list
RETVAL=$?
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
restart
;;
*)
echo "Usage: {start|stop|status|restart}"
exit 1
;;
esac
exit $RETVAL
Я должен был убедиться, что папка и PATH были явно установлены или доступны для пользователя root, поскольку сценарии init.d запускаются от имени пользователя root.
Используйте PM2.
Какой вариант лучше всего подходит для запуска серверного производственного сервера
Каковы преимущества запуска вашего приложения таким образом?
PM2 автоматически перезапустит ваше приложение, если оно выйдет из строя.
PM2 будет вести журнал необработанных исключений — в данном случае в файле по адресу /home/safeuser/.pm2/logs/app-err.log.
С помощью одной команды PM2 может гарантировать, что все приложения, которыми он управляет, перезапускаются при перезагрузке сервера. По сути, ваше приложение узла запустится как служба.
Forever не создавался для того, чтобы приложения-узлы работали как сервисы. Правильный подход — либо создать запись /etc/inittab (старые системы Linux), либо выскочку (более новые системы Linux).
Вот некоторая документация о том, как настроить это как выскочку: https://github.com/cvee/node-upstart
crontab
у меня не работает на CentOS x86 6.5. @reboot не работает.
Наконец я получил это решение:
Изменить: /etc/rc.local
sudo vi /etc/rc.local
Добавьте эту строку в конец файла. Измените USER_NAME
и PATH_TO_PROJECT
на свои. NODE_ENV=production
означает, что приложение работает в рабочем режиме. Вы можете добавить больше строк, если вам нужно запустить более одного приложения node.js.
su - USER_NAME -c "NODE_ENV=production /usr/local/bin/forever start /PATH_TO_PROJECT/app.js"
Не устанавливайте NODE_ENV
в отдельной строке, ваше приложение все равно будет работать в режиме разработки, потому что навсегда не получает NODE_ENV
.
# WRONG!
su - USER_NAME -c "export NODE_ENV=production"
Сохраните и закройте vi (нажмите ESC : w q return
). Вы можете попробовать перезагрузить сервер. После перезагрузки сервера ваше приложение node.js должно запускаться автоматически, даже если вы не входите в какую-либо учетную запись удаленно через ssh.
Вам лучше установить среду NODE_ENV
в вашей оболочке. NODE_ENV
будет установлено автоматически, когда ваша учетная запись USER_NAME
войдет в систему.
echo export NODE_ENV=production >> ~/.bash_profile
Таким образом, вы можете запускать такие команды, как навсегда остановить/запустить /PATH_TO_PROJECT/app.js
через ssh, не устанавливая снова NODE_ENV
.
Я написал скрипт, который делает именно это:
https://github.com/chovy/node-startup
Я не пробовал с навсегда, но вы можете настроить команду, которую она запускает, поэтому она должна быть прямой:
/etc/init.d/node-app start
/etc/init.d/node-app restart
/etc/init.d/node-app stop
Проблема с rc.local заключается в том, что доступ к командам осуществляется с правами root, что отличается от входа в систему как пользователя и использования sudo.
Я решил эту проблему, добавив сценарий .sh с командами запуска, которые я хочу, в etc/profile.d. Любой файл .sh в profile.d будет загружаться автоматически, и любая команда будет обрабатываться так, как если бы вы использовали обычный sudo.
Единственным недостатком этого является то, что указанный пользователь должен войти в систему, чтобы все началось, что в моей ситуации всегда было так.
Я пробовал много приведенных выше ответов. Ни один из них не работал у меня. Мое приложение установлено в /home
и как пользователь, а не как root. Вероятно, это означает, что когда запускаются вышеупомянутые сценарии запуска, /home
еще не смонтирован, поэтому приложение не запускается.
Затем я нашел эти инструкции от Digital Ocean:
Использование PM2, как объяснялось, было очень простым и работает отлично: с тех пор у моих виртуальных серверов было два физических сбоя - время простоя составляло всего около минуты.
полный пример crontab (находится в /etc/crontab) ..
#!/bin/bash
# edit this file with .. crontab -u root -e
# view this file with .. crontab -u root -l
# put your path here if it differs
PATH=/root/bin:/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
# * * * * * echo "executes once every minute" > /root/deleteme
@reboot cd /root/bible-api-dbt-server; npm run forever;
@reboot cd /root/database-api-server; npm run forever;
@reboot cd /root/mailer-api-server; npm run forever;
Вы можете использовать следующую команду в своей оболочке, чтобы запустить свой узел навсегда:
forever app.js //my node script
Вы должны помнить, что сервер, на котором работает ваше приложение, всегда должен оставаться включенным.