Як зробити так, щоб програма node.js запускалася постійно?


259

На сервері Debian я встановив Node.js. Я розумію, як запустити додаток із шпаклівки за допомогою цього командного рядка:

node /srv/www/MyUserAccount/server/server.js

і дістатися до нього за адресою 50.51.52.53:8080(IP та порт).

Але як тільки я закриваю шпаклівку, я більше не можу дістатись до адреси 50.51.52.53:8080.

Як зробити так, щоб програма Node.js запускалася постійно?

Як ви здогадуєтесь, я початківець з Linux та Node.js.


7
Зауважте, що pm2 є хорошою альтернативою Forever , якщо ви з будь-якої причини не хотіли використовувати Forever.
Кевін Б

дякую @KevinB github.com/Unitech/pm2 - це справді хороша альтернатива
Sachin Chavan

Відповіді:


220

Хоча інші відповіді вирішують проблему ОП, всі вони надмірно не пояснюють, чому він чи вона відчуває це питання.

Ключовим є цей рядок: "Я закриваю шпаклівку, тоді я не можу дістатися до адреси"

Коли ви ввійшли у свій віддалений хост на Putty, ви запустили процес Linux Linux, і всі команди, набрані з цього сеансу SSH, виконуватимуться як діти зазначеного процесу.

Ваша проблема полягає в тому, що коли ви закриваєте Putty, ви закінчуєте сеанс SSH, який вбиває цей процес і будь-які активні дочірні процеси. Коли ви закриваєте шпаклівку, ви ненавмисно вбиваєте ваш сервер, оскільки ви запустили його на перший план . Щоб уникнути такої поведінки, запустіть сервер у фоновому режимі , додавши & до вашої команди:

node /srv/www/MyUserAccount/server/server.js &

Проблема тут - відсутність знань Linux, а не питання про вузол. Для отримання додаткової інформації ознайомтесь: http://linuxconfig.org/understanding-foreground-and-background-linux-process

ОНОВЛЕННЯ:

Як вже згадували інші, сервер вузлів все ще може загинути при виході з терміналу. Загальна проблема, на яку я зіткнувся, полягає в тому, що, хоча процес вузла працює в bg, він є stdout і stderr все ще вказується на термінал. Це означає, що якщо сервер вузлів запише в console.log або console.error, він отримає помилку і помилку труби. Цього можна уникнути, простеживши результати свого процесу:

node /srv/www/MyUserAccount/server/server.js > stdout.txt 2> stderr.txt &

Якщо проблема не зникає, слід розглянути такі речі, як tmux або поЬір , які ще більш надійними , ніж вузол конкретних рішень, оскільки вони можуть бути використані для запуску всіх типів процесів (бази даних, каротажних служб, інших мов).

Поширена помилка, яка може призвести до виходу сервера, полягає в тому, що після запуску nohup node your_path/server.js &ви просто закриєте термінал Putty простим клацанням. Ви повинні використовувати exitкоманду замість цього, ваш сервер вузлів буде запущений і працює.


7
Якщо ви все ще закриваєте сесію "Шпаклівка", виконуючи &послугу, все-таки закривається. (Щойно перевірено на Debian Jesse)
NiCk Newman

1
Як сказав @NiCkNewman, ця відповідь неповна! Дивіться відповідь Ріка Роя для правильного рішення.
thejonwithnoh

19
"&" Робить процес запущеним у фоновому режимі, але вам потрібно було б додати "nohup" до початку цієї команди, щоб від'єднати його від вікна консолі, щоб програма не зупинялась, коли вікно переходить у режим сну після декількох годин, змінивши раніше згадану команду на:nohup node /srv/www/MyUserAccount/server/server.js &
SirRodge

2
AIX powersystem, nohup node myApp.js &запустив додаток в bg, але він вмирає, коли термін був закритий. Не впевнений, чому все-таки.
AnBisw

4
@Annjawn, вам потрібно використовувати exitкоманду для виходу з терміналу.
Іонут Некула

342

Ви можете назавжди встановити, використовуючи npm так:

sudo npm install -g forever

А потім почніть свою заявку з:

forever server.js

Або як послуга:

forever start server.js

Назавжди перезавантажте вашу програму, коли вона з якоїсь причини виходить з ладу або зупиняється. Щоб обмежити перезавантаження на 5, ви можете використовувати:

forever -m5 server.js

Щоб перелічити всі запущені процеси:

forever list

Зверніть увагу на цілі числа в дужках і скористайтеся ним для зупинки процесу:

forever stop 0

Перезапуск запущеного процесу йде:

forever restart 0

Якщо ви працюєте над файлом програми, ви можете використовувати -wпараметр, щоб автоматично перезапустити кожен раз, коли ваш server.jsфайл змінюється:

forever -w server.js

11
@MarthaJames якщо його закриття, коли ваш сеанс ssh / вікно закриється, ви, ймовірно, забули включити "старт" вforever start <file>
Крістіан

8
Яка різниця між використанням forever server.jsта forever start server.js? Я знаю, це говорить, що це "як послуга", але що це означає?
Маркіццо

5
Коли я набираю текст forever server.js, він запускає сервер. Якщо я натискаю Ctrl+ C, це припиняє послугу. Якщо я набираю, forever start server.jsто він запускає послугу, навіть якщо я натискаю Ctrl+, Cвона залишається відкритою. Потім ви можете виконати інші вказані вище команди, щоб зупинити / подивитися список. Ось що я пережив принаймні.
Термато

6
Чи запускається цей сценарій після перезавантаження сервера?
beingalex

1
foreverМодуль (v0.15.3) уразлива для регулярного виразу атак відмови в обслуговуванні і не повинні бути використані: github.com/foreverjs/forever/issues/960
Бенні Нойгебауер

82

Ви можете використовувати 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]

1
Бог вас благословить! це працює!! Forever і Nohup не працюють на веб-сервісі bitnami nodejs веб-сервісу Amazon ( docs.bitnami.com/aws/infrastructure/nodejs ). PM2 чудово працює!
polras

Здається, ця бібліотека має найбільшу кількість запусків на
Github

41

Я рекомендую шукати щось таке, як Forever, щоб перезапустити Node у разі аварії, і впоратися з демонізуванням цього для вас.


Я хотів би зазначити, що без цього nohup, вузол вийде, коли ви виходите з сеансу ssh, якщо запустити його таким чином (якщо ви не використовуєте щось для екрана tmux).
Хаожун

1
@Haozhun, Цікаво, але це не так, як це працює на мене на моїх машинах. Коли я заходжу і запускаю щось за допомогою цієї команди, вона працює назавжди на задньому плані, навіть після закриття сеансу SSH.
Бред

@Brad Будь ласка, дивіться другу відповідь на stackoverflow.com/questions/4018154 / ... . Здається, досить багато людей згодні з першим коментарем цього питання, який пояснює nohup. Було б чудово, якщо ми зможемо вирішити цю плутанину. Але я не знаю, з чого почати.
Хаожун

4
Для більшості unixen (включаючи більшість дистрибутивів Linux) запуск елементів у фоновому режимі все одно знищить процес, якщо ви закриєте вікно терміналу. Щоб запобігти цьому, запустіть йогоnohup . Приклад:nohup node app.js &
slebetman

1
Я використовую Forever з виробництвом Linux env. Я зазвичай використовую команду назавжди запускати --minUptime 10000 -o /logs/myapp.log nodeApp.js
mbokil

36

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

Встановити на ubuntu / debian:

sudo apt-get install screen

Використання:

$ screen
$ node /path/to/app.js

ctrl + aа потім ctrl + dзвільнити

Щоб повернутися:

Один екран: screen -r

Якщо їх більше, ви можете перелічити всі екрани за допомогою: screen -ls

І потім: screen -r pid_number


1
Це хороший варіант, оскільки він також дозволяє мені переключити процес на передній план у будь-який час
aexl

26

Ви можете просто скористатися цим

nohup node /srv/www/MyUserAccount/server/server.js &

Це призведе до того, що додаток буде запущено, і щоб його закрити, вам доведеться його вбити.

Для цього ви можете встановити, htopа потім шукати вузол, а потім вбивати його


18
Важливо зазначити, що в цьому випадку користувачеві потрібно буде належним чином вийти з сеансу PuTTY (тобто за допомогою exitкоманди). Якщо користувач просто закриває вікно, це може використовувати сигнал, відмінний від того, SIGHUPщоб закінчити процес, і тому вузол все одно відключиться.
thejonwithnoh

1
+1 за те, що це просте універсальне рішення проблеми Linux. Це краще, ніж відповідь DogNibbler .
thejonwithnoh

@thejonwithnoh, прочитавши ваш коментар, я спробував із різким закриттям шпаклівки, але сервер все ще працював, можливо, це стосувалося того, як налаштовано env. Але я зрозумів, що просить ОП це найпростіший спосіб досягти цього
Рік Рой

Мені подобається цей простий підхід, саме той, який я використовую, що стосується його вбивства, найпростіший - це лише той killall node, який знищить усі вузлові процеси, в моєму випадку лише один.
Нельсон

@Nelson Це знищило б усі процеси у вузлах, що, якщо у вас працює кілька сценаріїв і хочете припинити лише один конкретний, я б запропонував вам знайти цей процес, а потім припинити цей конкретний випадок на випадок, якщо у вас на виробничому сервері працювали кілька процесів вузлів і не хочеться відчувати, як потрапити в кошмар: D
Рік Рой

12

Назавжди це дуже хороший модуль NodeJs, який робить саме це.

Встановити forever, ввівши в командному рядку

$ npm install forever -g

Потім використовуйте наступну команду для запуску сценарію node.js

$ forever start /path/to/script.js

Вам добре піти. Додатково можна запустити

$ forever list

щоб побачити всі запущені сценарії. Ви можете скасувати будь-який конкретний сценарій, ввівши

$ forever stop [pid]

де [pid]ідентифікатор процесу сценарію, який ви отримаєте з listкоманди. Щоб зупинити всі сценарії, ви можете ввести

$ forever stopall

10

nohup працює я перевірив AWS Ubunto vm дотримуйтесь правильногоsyntax

ubuntu@ip-172-00-00-00:~/ms$ nohup node server.js &

потім натисніть клавішу Enter, ви побачите цей рядок

ubuntu@ip-172-00-00-00:~/ms$ nohup: ignoring input and appending output to nohup.out

потім введіть це

rm nohup.out

введіть тут опис зображення


3
Мені подобається, як ви викреслили ім'я хоста в маленькому підказці bash, але залишили його у великій назві вікна 😂
conny

10

Установка

$ [sudo] npm install forever -g

Ви можете використовувати назавжди для безперервного запуску сценаріїв

forever start server.js

forever list

для зупинки

forever stop server.js

9

Ось настінне рішення, яке я використовую для своїх особистих проектів:

Розмістіть його в /etc/init/node_app_daemon.conf:

description "Node.js Daemon"
author      "Adam Eberlin"

stop on shutdown

respawn
respawn limit 3 15

script
  export APP_HOME="/srv/www/MyUserAccount/server"
  cd $APP_HOME
  exec sudo -u user /usr/bin/node server.js
end script

Це також дозволить переробити додаток у випадку, якщо він вийде з ладу. Він відмовиться від спроб відновити вашу програму, якщо вона вийде з ладу 3 або більше разів менше ніж за 15 секунд.


9

Під час розробки рекомендую використовувати нодемон . Він перезапустить ваш сервер щоразу, коли файл зміниться. Як зазначали інші, Forever - це варіант, але у виробництві все залежить від платформи, яку ви використовуєте. Зазвичай ви хочете використовувати рекомендований операційною системою спосіб підтримки послуг (наприклад, http://www.freedesktop.org/wiki/Software/systemd/ ).


Це працювало для мене на застосуванні MEAN.JS - nodemonвиконує команду grunt, якщо не вказати файл JS сервера, тому я використовую це для запуску mongo та вузла назавжди / одночасно
J-Dizzle

8

Я знайшов назавжди зробити цю роботу ідеально чудово.

Якщо ви вже встановили npm, якщо ні, просто зробіть

sudo apt-get install npm

Тоді встановіть назавжди

npm install forever --global

Тепер ви можете запустити його так

forever start app.js

https://codingweb.io/run-nodejs-application-background/


npm rm -g назавжди для його видалення
DragonFire


5

Ще один спосіб - створити системний блок для вашої програми. створити файл "XXX.service" у папці "/ etc / systemd / system", подібний до цього:

[Unit]
Description=swagger
After=network.target

[Service]
ExecStart=/usr/bin/http-server /home/swagger/swagger-editor &
WorkingDirectory=/home/swagger
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target

Перевага полягає в тому, що додаток буде працювати як послуга, воно автоматично перезапуститься, якщо воно вийшло з ладу.

Ви також можете використовувати sytemctl для управління ним:

systemctl start XXXзапустити послугу, systemctl stop XXXзупинити її та systemctl enable XXXавтоматично запустити додаток при завантаженні системи.


4

Я сподіваюся, що це вам допоможе.

У командному рядку встановіть назавжди:

npm install forever -g

Створіть прикладний файл:

sudo nano server.js 

Ви можете редагувати файл та отримувати результати безпосередньо у своєму браузері.
Ви можете використовувати filezilla або будь-який редактор для редагування файлу. Запустіть цю команду для запуску файлу:

forever start --minUptime 1 --spinSleepTime 1000 -w server.js

введіть тут опис зображення


3

Не потрібно встановлювати будь-який інший пакет.

Виконайте цю команду

node server.js > stdout.txt 2> stderr.txt &

server.js - це файл вашого сервера, або він може бути api.js

Після цього натисніть " вихід ", щоб закрити термінал

exit

2

Я рекомендую використовувати PM2, який є менеджером процесів для програм Node.js. PM2 забезпечує простий спосіб керування та демонізувати програми (запускати їх як сервіс).

перейдіть за цим посиланням - https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-centos-7


1
Уже є відповідь, що рекомендує PM2. stackoverflow.com/a/40254977/390718
Hopia

0

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

npm -g install forever

Спробуйте:

npm -g install forever deep-equal@1.1.1

замість цього.

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