Я использую node навсегда модуль, чтобы поддерживать мой сервер node. Однако Forever завершается при перезапуске системы. Можно ли автоматически запустить сервер node (с вечно) при перезапуске системы?
Автоматически запускать навсегда (node) при перезапуске системы
Ответ 1
Я бы предложил использовать 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" вашим целевым именем пользователя), чтобы перечислить установленные в настоящий момент кроны:
$ crontab -u testuser -l
Обратите внимание, что, на мой взгляд, вы всегда должны использовать полные пути при выполнении двоичных файлов в cron.
Кроме того, если путь к вашему вечно script неверен, запустите which forever
, чтобы получить полный путь.
Учитывая, что forever
вызывает node
, вы также можете указать полный путь к node
:
@reboot /usr/local/bin/forever start -c /usr/local/bin/node /your/path/to/your/app.js
Дополнительная литература
Ответ 2
Вы можете использовать forever-service для этого.
npm install -g forever-service
forever-service install test
Это предоставит app.js в текущем каталоге как услугу навсегда. Служба будет автоматически перезагружаться при каждом перезапуске системы. Также при остановке он попытается сделать изящную остановку. Этот script также устанавливает логротат script.
Github url: https://github.com/zapty/forever-service
ПРИМЕЧАНИЕ. Я являюсь автором forever-service.
Ответ 3
Этот случай действителен для Debian.
Добавьте следующее к /etc/rc.local
/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}
{{user}}
заменяет ваше имя пользователя.{{app path}}
заменяет путь к вашему приложению. Например,/var/www/test/app.js
Ответ 4
-
Установите PM2 глобально с помощью NPM
npm install pm2 -g
-
Начните свой script с pm2
pm2 start app.js
-
создать активный запуск script
pm2 startup
ПРИМЕЧАНИЕ. Запуск pm2 предназначен для запуска PM2 при перезагрузке системы. PM2 как только начал, перезапускает все процессы, которые он управлял, прежде чем система опустилась.
Если вы хотите отключить автоматический запуск, просто используйте pm2 unstartup
Если вы хотите, чтобы запуск script выполнялся под другим пользователем, просто используйте параметр -u <username>
и --hp <user_home>:
Ответ 5
Альтернативный метод crontab, основанный на этом, и этот блог.
1. Создайте файл bash script (измените 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 script можно выполнить.
chmod 700 /home/bob/node_server_init.sh
4. Замените "bob" пользователем времени выполнения node.
crontab -u bob -e
5. Скопируйте и вставьте (измените bob на желаемого пользователя).
@reboot /bin/sh /home/bob/node_server_init.sh
Сохраните crontab.
Вы добрались до конца, ваш приз - перезагрузка (для тестирования):)
Ответ 6
Скопированный ответ из прикрепленного вопроса.
Вы можете использовать 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]
Ответ 7
Для этого вам нужно создать оболочку script в папке /etc/init.d. Это сложно, если вы никогда этого не делали, но в Интернете есть множество информации о скриптах init.d.
Вот пример a script, который я создал для запуска сайта 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.
Ответ 8
Используйте PM2
Каков наилучший вариант для запуска серверного сервера сервера
В чем преимущества запуска приложения таким образом?
-
PM2 автоматически перезапустит ваше приложение, если оно сработает.
-
PM2 будет хранить журнал ваших необработанных исключений - в этом случае в файле /home/safeuser/.pm2/logs/app-err.log.
-
С помощью одной команды PM2 может гарантировать, что все приложения, которым он управляет, перезагружаются при перезагрузке сервера. В основном, ваше приложение node запустится как служба.
Ответ 9
Forever не был создан, чтобы получать приложения node, запущенные как службы. Правильный подход состоит в том, чтобы либо создать запись /etc/inittab (старые системы linux), либо выскочить (более новые Linux-системы).
Вот некоторая документация о том, как установить это как выскочку: https://github.com/cvee/node-upstart
Ответ 10
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
.
Ответ 11
Я написал script, который делает именно это:
https://github.com/chovy/node-startup
Я не пробовал навсегда, но вы можете настроить команду, которую он запускает, поэтому она должна быть прямой:
/etc/init.d/node-app start
/etc/init.d/node-app restart
/etc/init.d/node-app stop
Ответ 12
Я попробовал много ответов. Никто из них не работал у меня. Мое приложение установлено в /home
и как пользователь, а не как root. Вероятно, это означает, что при запуске вышеупомянутых стартовых скриптов /home
еще не установлен, поэтому приложение не запускается.
Затем я нашел эти инструкции Digital Ocean:
Использование PM2, как объяснялось, было очень простым и прекрасно работает: у моих виртуальных серверов было два физических сбоя, поскольку время простоя составляло всего около минуты.
Ответ 13
Проблема с rc.local заключается в том, что к командам обращаются как к root, которые отличаются от входа в систему как пользователь и используют sudo.
Я решил эту проблему, добавив .sh script с командами запуска, которые я хочу в etc/profile.d. Любой файл .sh в файле profile.d будет загружаться автоматически, и любая команда будет обрабатываться так, как если бы вы использовали обычное sudo.
Единственный недостаток этого заключается в том, что указанному пользователю требуется loggin для начала работы, что в моей ситуации всегда было.
Ответ 14
Вы можете использовать следующую команду в своей оболочке, чтобы запустить ваш узел навсегда:
forever app.js //my node script
Необходимо помнить, что сервер, на котором работает ваше приложение, всегда должен быть включен.
Ответ 15
полный пример 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;