Автоматичний запуск назавжди (вузол) при перезапуску системи


190

Я використовую вічний модуль назавжди, щоб підтримувати сервер мого вузла. Однак назавжди припиняється, коли відбувається перезавантаження системи. Чи є спосіб я автоматично запустити сервер вузлів (з назавжди), коли система перезапуститься?


1
Це сервер у хмарі? У вас є сценарії завантаження для цього?
Хорхе Аранда

6
Оформити замовлення PM2 ! Він також підтримує генерацію сценаріїв запуску (systemd, systemv ...) pm2.keymetrics.io/docs/usage/startup
Unitech

Відповіді:


343

Я б запропонував використовувати кронтаб. Це простий у використанні.

Як

  1. Щоб почати редагування, виконайте наступне, замінивши "testuser" на потрібного користувача часу виконання для процесу вузла. Якщо ви вибрали іншого користувача, крім себе, вам доведеться запустити це з судо.

    $ crontab -u testuser -e
  2. Якщо ви ніколи цього не робили, він запитає, з яким редактором ви хочете редагувати. Мені подобається vim, але рекомендую нано для зручності використання.

  3. Одного разу в редакторі додайте наступний рядок:

    @reboot /usr/local/bin/forever start /your/path/to/your/app.js
  4. Збережіть файл. Ви повинні отримати відгуки про те, що крон встановлений.

  5. Для подальшого підтвердження встановлення крона виконайте наступне (знову замінивши "testuser" на ваше цільове ім'я користувача), щоб перелічити встановлені на даний момент крони:

    $ 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

Подальше читання


2
Цей підхід хороший, але лише у тих випадках, коли система перезавантажується. Якщо сервер вимкнений і потім увімкнений, ця робота не буде виконана.
ecdeveloper

6
Що змушує вас це думати? en.wikipedia.org/wiki/Cron#Predefined_scheduling_definitions Пояснює, що @rebootкрон запускається на запуску cron deamon. Додамо, я ніколи не стикався з ситуацією, яка б підказувала, що мій cron, який встановлений @reboot, не працює при завантаженні системи. Те, як ви його відключили, для цього не має значення.
Джуліян Ланніган

16
Здається, /homeце ще не встановлено, тому це не працюватиме, якщо ваш код живе /home.
чови

6
Я виявив, що вищезгадане для мене не вдалося, оскільки вузол не стоїть на шляху, коли cron намагається запуститись назавжди, навіть із опцією -c. Однак виявляється, що ви можете додати оператор PATH = безпосередньо в crontab, поки він знаходиться вище операторів розкладу. Після встановлення PATH заява @reboot працювала як мрія.
ЙоркширКев

2
Дякую за Ваш коментар @chovy, це було дуже корисно. Тим, хто використовує змінні середовища від bashrc, пам’ятай його коментар. Оскільки / home не встановлено, воно не працюватиме. Встановіть змінні за допомогою команди crontab на зразок@reboot varname=value ...
lsborg

123

Для цього ви можете використовувати сервіс навіки.

npm install -g forever-service
forever-service install test

Це надасть app.js у поточному каталозі як послугу через назавжди. Служба автоматично перезапускається кожного разу при перезапуску системи. Також при зупинці він спробує витончену зупинку. Цей сценарій також забезпечує логротатний сценарій.

URL-адреса Github: https://github.com/zapty/forever-service

ПРИМІТКА: Я автор вічної служби.


2
Використовуйте параметр -e "PORT = 80 ENV = prod FOO = bar"
арва

2
Я не розумію, як запустити службу назавжди. Що це за "тест" у "тесті на вічну службу встановлення"? Моя команда назавжди запустити додаток: "/ usr / local / bin / forever start -c / usr / local / bin / node / home / alex / public / node_modules / http-server / bin / http-server -s - d помилково ". Що я мав би написати?
Олексій

3
Тест тут - назва служби. коли ви запускаєте тест встановлення вічно-сервісної служби, він створює службу, яку називають тестом, для запуску app.js у цьому каталозі, яку слід запускати як службу. Я б запропонував прочитати довідкову документацію на сторінці gihub і додати там проблему, якщо ви не можете її зрозуміти.
арва

6
@Alex - уточнити коментар ARVA в - в прикладі forever-service install test, testбуде назва служби , але не ім'я файлу самої програми / вузла .js для запуску. За замовчуванням, передбачається , назва програми app.js, але ви можете змінити його за допомогою --scriptпрапора, наступним чином : forever-service install test --script main.js. (Неперевірено, тому, будь ласка, виправте мене, якщо якась синтаксична деталь неправильна.)
Dan Nissenbaum

3
@DanNissenbaum Дякую за відповідь. Зараз я використовую PM2, який прекрасно працює. Інструкції: digitalocean.com/community/tutorials/…
Алекс

26
  1. Встановіть PM2 у всьому світі, використовуючи NPM

    npm install pm2 -g

  2. Почніть свій сценарій з pm2

    pm2 start app.js

  3. генерувати активний сценарій запуску

    pm2 startup

    ПРИМІТКА. Запуск pm2 - це запуск PM2 при перезавантаженні системи. Після запуску PM2 перезапускає всі процеси, якими керувала до того, як система вийшла з ладу.

Якщо ви хочете відключити автоматичний запуск, просто використовуйте pm2 untartup

Якщо ви хочете, щоб сценарій запуску виконувався під іншим користувачем, просто скористайтеся -u <username>опцією та--hp <user_home>:


Будь ласка, не публікуйте однакову відповідь на кілька запитань.
FelixSFD

Мені дуже подобається, як pm2 вдосконалюється та постачається із приголомшливим інструментом моніторингу. Сподіваюся, що це більше підкреслено для інших. @ rv7 Я впевнений, що ви це бачили, але є рішення Windows: npmjs.com/package/pm2-windows-service . Я сам не пробував цього, хоча.
Джон Лі

26

Цей випадок дійсний для Debian.

Додайте до /etc/rc.local

/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}

  • {{user}} замінює ваше ім'я користувача.
  • {{app path}}замінює ваш шлях до програми. Наприклад,/var/www/test/app.js

2
Цей метод не стосується витончених відмов, хоча для багатьох людей це, мабуть, не проблема.
UpTheCreek

6
BTW - Я думаю, ви повинні редагувати /etc/rc.local, а не/etc/init.d/rc.local
UpTheCreek

Погодьтеся з @UpTheCreek, що /etc/rc.local є більш підходящим місцем для додавання цього питання - дивіться: unix.stackexchange.com/a/59945 для чудового пояснення.
Так над цим

2
Крім того, ви можете вказати "поточну робочу директорію", app.jsщоб переконатися, що відносні файли завантажуються правильно - process.chdir('/your/path/to/your/app'); Node.js ref docs тут
So Over It

1
Якщо вам потрібно встановити змінні середовища для сценарію Node.JS (як $ PORT для експресу), додавши наступний рядок, щоб /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" )
sffc

11

Альтернативний метод кронтабування, натхненний цією відповіддю та цією публікацією в блозі.

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. Скопіюйте та вставте (змініть bob на потрібного користувача).

@reboot /bin/sh /home/bob/node_server_init.sh

Збережіть кронтаб.

Ви зробили це до кінця, ваш приз - це перезавантаження (для тестування) :)


Цей метод найкраще працював для мене. Назавжди вийшов би, коли я поклав повний шлях до файлу server.js. Якби я запустив його в один і той же каталог, Foreveer працював би чудово. Причиною цього не вдалося, що файл server.js включав інші файли, але шляхи були зіпсовані. За допомогою цього методу я міг CD у своєму .sh скрипті до каталогу, а потім запустити все, що стосується там.
BeardedGeek

9

Скопійовано відповідь із доданого питання .

Можна використовувати 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]

Як це запускається АВТОМАТИЧНО при завантаженні системи? Ви просто копіюєте / вставляєте вручну CLI введення тексту
Зелений

@Green, Run, $pm2 startupПісля цього з'явиться pm2 з проханням вручну запустити команду, скопіювати та запустити її. Тоді, $pm2 saveтепер ваш app.js переживе перезавантаження системи
yajnesh

7

Для цього потрібно створити скрипт оболонки в папці /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 були явно встановлені або доступні кореневому користувачеві, оскільки сценарії init.d запускаються як root.


2
Якщо у вас є якісь залежності, які також починаються з init.d, можливо, у вас можуть виникнути проблеми із завантаженням замовлення.
UpTheCreek

@ alexandru.topliceanu Я поправив посилання.
Гектор Кореа

6

Використовуйте PM2

Який найкращий варіант запустити сервер виробництва сервера

Які переваги запуску вашої програми таким чином?

  • PM2 автоматично перезапустить вашу програму, якщо вона вийде з ладу.

  • PM2 зберігатиме журнал ваших необроблених винятків - у цьому випадку у файлі за адресою /home/safeuser/.pm2/logs/app-err.log.

  • За допомогою однієї команди PM2 може забезпечити перезавантаження будь-яких додатків, якими він керує, коли сервер перезавантажується. В основному, ваш додаток для вузла запуститься як послуга.

ref: https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps


5

Назавжди не створювалося, щоб програми вузлів працювали як служби. Правильний підхід полягає у створенні запису / etc / inittab (старі системи Linux) або на початку (новіші системи Linux).

Ось деяка документація про те, як налаштувати це як початковий процес: https://github.com/cvee/node-upstart


Upstart провалив мене на CentOS, і я прочитав, що це зникне. Створення запису init.d насправді не є найбільш зручним для користувачів способом, але я вважаю, що це linux :)
Жорре

5

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знову.


отримала таку ж проблему на debian 7.6. Це виправлено для мене. Велике дякую.
Даніеле Врут

На випадок, якщо ви не хочете використовувати "назавжди", ви можете змінити рядок на "su - USER_NAME -c" NODE_ENV = виробничий вузол / PATH_TO_PROJECT / bin / www "'.
yaobin

3

Я написав сценарій, який робить саме це:

https://github.com/chovy/node-startup

Я не намагався з цим назавжди, але ви можете налаштувати команду, яку вона виконує, тому вона повинна бути прямо вперед:

/etc/init.d/node-app start
/etc/init.d/node-app restart
/etc/init.d/node-app stop

1

Я перепробував багато вищезазначених відповідей. Жоден з них не працював на мене. Мій додаток встановлено в /homeі як користувач, а не як root. Це, ймовірно, означає, що коли вищезазначені сценарії запуску /homeще не встановлені, тому додаток не запускається.

Потім я знайшов ці вказівки від Digital Ocean:

https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

Використовувати PM2, як було пояснено, було дуже просто і прекрасно працює: з моїх віртуальних серверів було два фізичні збої з тих пір - простої були лише близько хвилини.


PM2 має набагато більше зірок (2х) на github, ніж назавжди, і він також має більше можливостей. Я думаю, що більшість відповідей тут застарілі.
inf3rno

1

Проблема rc.local полягає в тому, що до команд звертається як до root, який відрізняється від входу в систему як користувача та використання sudo.

Я вирішив цю проблему, додавши .sh скрипт із командами запуску, які я хочу до etc / profile.d. Будь-який .sh файл у profile.d завантажується автоматично, і будь-яка команда буде розглядатися так, як якщо б ви використовували звичайний sudo.

Єдиним недоліком цього є те, що вказаний користувач повинен увійти в систему, щоб почати все, що в моїй ситуації було завжди.


0

повний приклад 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;

-1

Ви можете використовувати таку команду в оболонці, щоб назавжди запустити свій вузол:

forever app.js //my node script

Потрібно пам’ятати, що сервер, на якому працює ваша програма, завжди повинен тримати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.