Як запустити додаток node.js як фонову послугу?


503

Оскільки ця публікація привертала багато уваги протягом багатьох років, я перелічував найкращі рішення на платформі внизу цієї публікації.


Оригінальна публікація :

Я хочу, щоб мій сервер node.js запускався у фоновому режимі, тобто: коли я закриваю свій термінал, я хочу, щоб мій сервер продовжував працювати. Я погуглив це і придумав цей підручник , однак він не працює за призначенням. Тож замість того, щоб використовувати цей сценарій демона, я думав, що я просто використав перенаправлення виводу ( 2>&1 >> fileчастина), але це теж не виходить - я отримую порожній рядок у своєму терміналі, наче він чекає на вихід / помилки.

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

Тож як я можу залишити його працює, коли вимкнув свій локальний комп'ютер?


Найкращі рішення :


3
Я думаю, він мав на увазі закрити свою локальну систему
Камал Редді

46
він означав, що закриття сеансу ssh припиняє завдання
thedjaney

5
github.com/Unitech/pm2 - це дуже підтримуваний та дуже стабільний менеджер процесів, спробуйте!
Об’єднайтесь

1
Ви можете використовувати екран ( aperiodic.net/screen/quick_reference )
karantan

Відповіді:


433

Копіювання власної відповіді з Як запустити додаток Node.js як власний процес?

Відповідь 2015 року : майже кожен дистрибутив Linux постачається із системою systemd, а це означає, що навіки, monit, PM2 тощо, більше не потрібні - ваша ОС вже справляється з цими завданнями .

Створіть myapp.serviceфайл (очевидно, замінивши "myapp" на ім'я програми):

[Unit]
Description=My app

[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nogroup
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target

Зверніть увагу, якщо ви новачок у Unix: /var/www/myapp/app.js має бути #!/usr/bin/env nodeв першому рядку.

Скопіюйте службовий файл у /etc/systemd/system.

Почніть з цього systemctl start myapp.

Увімкніть його для запуску із завантаженням systemctl enable myapp.

Перегляньте журнали з journalctl -u myapp

Це взято з розділу Як ми розгортаємо програми вузлів на Linux, видання 2018 року , що також включає команди для створення AWS / DigitalOcean / Azure CloudConfig для створення серверів Linux / вузлів (включаючи .serviceфайл).


4
На початку, коли вони є, також є хорошим рішенням. в будь-якому випадку, ви не повинні покладатися на процес nodejs, щоб тримати демон nodejs працює. Це одне завдання лише для ОС. killall nodejs і назавжди пропало ....
131

19
Зауважте, що також можна запускати системні служби як користувач. Дивіться, наприклад, цей підручник . Ви можете помістити службовий файл ~/.config/systemd/user, запустити його systemctl --user start myapp, увімкнути його systemctl --user enable myapp.
cdauth

5
Дякую за цю відповідь. Це те, що я хочу чисто і зрозуміло
bmavus

5
Я прийняв цю відповідь замість відповіді "назавжди", оскільки я також вважаю, що це найкращий спосіб зробити це. Існують подібні відповіді для Mac & Windows, але я думаю, що більшість шукає рішення для Linux.
Пітер Кройтхоф

11
у EC2 шляху AMI / etc / systemd / system не існує. Чи можете ви вказати, який правильний шлях у AWS EC2 Linux AMI?
Рене Мішель

241

Ви можете використовувати Forever, простий інструмент CLI для забезпечення того, що заданий сценарій вузла працює постійно (тобто назавжди): https://www.npmjs.org/package/forever


4
З останнім вузлом я не зміг змусити його зупинити додаток через ім'я скрипта (помилка) - також - як правило, неправильно поводився (був на OS-X) - все побудовано з джерела, як не дивно. Залишив речі в поганому стані, не наповнив мене впевненістю.
Майкл Ніл

4
Хоча nohup робить трюк, назавжди це краще рішення, оскільки воно демонструє процес. Чудовий інструмент!
Пітер Круйтхоф

5
До речі, тут доступний простіший підручник: Тримайте сервер node.js з Forever
kehers

2
Я користувався Forever деякий час, на початку все здається нормальним, але потім трапилося лихо. Назавжди більше не можна було керувати процесами і не дозволяти їм дивитися. Досі намагаються знайти краще рішення. Я спробую використовувати nohup
LN

5
Джеффрі - ні, вам потрібно буде виконати forever start /path/to/yourApp.jsсценарій запуску сервера.
mikermcneil

215

ОНОВЛЕННЯ - Як згадувалося в одній з відповідей нижче, у PM2 функціонал, який назавжди відсутній, відсутній. Подумайте про його використання.

Оригінальний відповідь

Використовуйте nohup :

nohup node server.js &

EDIT Я хотів додати, що прийнята відповідь - це справді шлях. Я використовую назавжди в тих випадках, коли потрібно не відставати. Мені подобається це робити npm install -g foreverтак, щоб це було у шляху до вузла, а потім просто робитиforever start server.js


136
класна частина, щоб знати: nohupпідставки, no hangupякі походять зі старих часів, де ви хотіли, щоб ви підтримували процес, коли ви "повісили" свій модем.
jAndy

1
сьогодні це швидше назва сигналу 1, який отримують процеси, щоб попередити, що користувач закрив оболонку (або загубив модемне з'єднання, звичайно: P)
lapo

7
Це не найкраще рішення, тому що якщо програма стикається з помилковою помилкою, процес вузла вийде і не перезапуститься. І все-таки це розумний варіант для розвитку.
Енді Е

1
Як я можу додати до цього змінні середовища? наприклад: PORT = 80 вузлів server.js
індульгенцій

1
Ознайомтеся з цією відповіддю від SO - stackoverflow.com/questions/8825460/…
NG.

67

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

screen
node myserver.js
>>CTRL-A then hit D

Екран від'єднається та виживе, коли ви вийдете з системи. Тоді ви можете повернути його назад, роблячи екран -r. Щоб отримати докладнішу інформацію, натисніть посібник із екрана. Якщо ви хочете, ви можете називати екрани і що ні.


2
Також tmux приємно. Працює як екран (CTRL-B за замовчуванням замість CTRL-A, але налаштовується). Tmux має панелі (розділені екрани).
snapfractalpop

1
на екрані теж є панелі
Біллі Мун

Я використовую це з декількох тижнів для програми метеора. $ screen -dr для від'єднання та повторного прив’язки може знадобитися періодично.
Vinay Vemula

Для мене найпростіший спосіб зробити цю роботу. Але я згоден, не найкраще рішення
Помме де Терре

Це рішення не зберігається після перезавантаження системи
wnasich

60

Оновлення 2016 року: серія node-windows / mac / linux використовує загальний API для всіх операційних систем, тому це абсолютно відповідне рішення. Однак; node-linux генерує файли systemv init. Оскільки systemd продовжує рости в популярності, це реально кращий варіант для Linux. ПР-ласкаво просимо, якщо хтось хоче додати системну підтримку до node-linux :-)

Оригінальна нитка:

Це вже досить стара нитка, але вузольні вікна - це ще один спосіб створення фонових служб у Windows. Це вільно базується на nssmконцепції використання exeобгортки навколо сценарію вашого вузла. Однак; він використовує winsw.exeнатомість і забезпечує конфігурувану вузольну обгортку для більш детального контролю над тим, як процес починається / зупиняється на збоях. Ці процеси доступні, як і будь-яка інша служба:

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

Модуль також записується в журнал деяких подій:

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

Демонізування вашого сценарію здійснюється за допомогою коду. Наприклад:

var Service = require('node-windows').Service;

// Create a new service object
var svc = new Service({
  name:'Hello World',
  description: 'The nodejs.org example web server.',
  script: 'C:\\path\\to\\my\\node\\script.js'
});

// Listen for the "install" event, which indicates the
// process is available as a service.
svc.on('install',function(){
  svc.start();
});

// Listen for the "start" event and let us know when the
// process has actually started working.
svc.on('start',function(){
  console.log(svc.name+' started!\nVisit http://127.0.0.1:3000 to see it in action.');
});

// Install the script as a service.
svc.install();

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

Оскільки послуги вузлів Windows працюють, як і будь-які інші, можна керувати / контролювати службу за допомогою будь-якого програмного забезпечення, яке ви вже використовуєте.

Нарешті, makeзалежностей немає . Іншими словами, пряма npm install -g node-windowsробота буде працювати. Для цього вам не потрібна Visual Studio, .NET або магія node-gyp. Крім того, це ліцензія на MIT та BSD.

Повністю розкриваючи, я є автором цього модуля. Він був розроблений для полегшення точного болю, який відчув ОП, але при більш тісній інтеграції у функціонал, який Операційна система вже надає. Сподіваюсь, майбутні глядачі з цим самим питанням вважають його корисним.


8
Зараз я переніс це на node-mac , забезпечуючи ту ж функціональність на OSX.
Корі

1
Я вирішив запланувати пару програм Node і стояти перед рішенням вибрати вікна вікна, Forever або Kue. Я схиляюся до вікон-вузлів, але хотів би зрозуміти, чому б не використовувати Forever або Kue, коли я хочу запланувати та відслідковувати десяток програм із вузлами. Деякі бігають вічно. Також потрібен моніторинг.
Крістіан Вестербек

5
Node-windows використовує вбудовану ОС для управління фоновими службами та нативний журнал подій для ведення журналів. Назавжди є власний моніторинг та ведення журналів. Я написав статтю з цього приводу на веб- сайті medium.com/p/2a602ea657a2 Це здається, що вам потрібно планувати свої сценарії, а не запускати їх весь час як фонові служби. Для цього розроблені такі проекти, як Kue та Agenda. Вузольні вікна та назавжди служать іншій цілі.
Корі

1
@Corey, як я запускаю приклад, включений до node-mac ?, з терміналу, я спробував node install.js, але це, здається, не підбирає helloworld.js
Едвін Ікечукво Оконкво

@Edwin - Можливо, найкраще відкрити нове запитання з більш детальною інформацією про проблему, включаючи код, який ви використовуєте.
Корі

28

ОНОВЛЕННЯ : я оновлений, щоб включити останнє з pm2:

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

https://github.com/unitech/pm2

http://pm2.io

  • він має дійсно корисну функцію моніторингу -> досить «gui» для моніторингу командного рядка декількох процесів pm2 monitабо списку процесівpm2 list
  • організоване управління журналом -> pm2 logs
  • інші речі:
    • Конфігурація поведінки
    • Підтримка вихідних карт
    • PaaS сумісний
    • Переглянути та перезавантажити
    • Модульна система
    • Максимальне перезавантаження пам’яті
    • Режим кластера
    • Гаряче перезавантаження
    • Розвиток робочого процесу
    • Сценарії запуску
    • Автоматичне завершення
    • Робочий процес розгортання
    • Моніторинг клавіатури
    • API

20

Якщо ви просто хочете безперебійно запускати сценарій до його завершення, ви можете використовувати, nohupяк уже було сказано у відповідях тут. Однак жодна з відповідей не забезпечує повну команду, яка також реєструє stdinта stdout.

nohup node index.js >> app.log 2>&1 &
  • В >>означає додавання до app.log.
  • 2>&1гарантує, що помилки також надсилаються stdoutта додаються до app.log.
  • Закінчення &гарантує, що ваш поточний термінал відключений від команди, щоб ви могли продовжувати роботу.

Якщо ви хочете запустити сервер вузлів (або щось, що повинно запускатися під час перезавантаження сервера), вам слід скористатися systemd / systemctl .


1
найкраща відповідь m8.
bholagabbar

1
чудово пояснено
Прахар Пракаш Bhardwaj

19

Якщо ви працюєте з OSX, найпростіший спосіб створити справжній системний процес - це використовувати launchdдля його запуску.

Створіть подібний список і вставте його в / Бібліотека / LaunchDaemons з назвою top-level-domain.your-domain.application.plist(потрібно розміщувати root під час розміщення):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>top-level-domain.your-domain.application</string>

    <key>WorkingDirectory</key>
    <string>/your/preferred/workingdirectory</string>

    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/node</string>
        <string>your-script-file</string>
    </array>

    <key>RunAtLoad</key>
    <true/>

    <key>KeepAlive</key>
    <true/>

</dict>
</plist>

Закінчивши, видайте це (як корінь):

launchctl load /Library/LaunchDaemons/top-level-domain.your-domain.application.plist
launchctl start top-level-domain.your-domain.application

і ти біжиш.

І ви все одно будете працювати після перезавантаження.

Інші параметри в списку дивіться на сторінку чоловіка тут: https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html


Який користувач буде запускати послугу? Чи є спосіб встановити користувача?
rjmunro

15

Спробуйте запустити цю команду, якщо ви використовуєте nohup -

nohup npm start 2>/dev/null 1>/dev/null&

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

forever start -c "npm start" ./ 

PM2 також підтримує npm start

pm2 start npm -- start

2
thnx, це спрацювало чудово. pm2 start npm -- start
ядавр

13

Я просто використовую модуль демона npm:

var daemon = require('daemon');

daemon.daemonize({
    stdout: './log.log'
  , stderr: './log.error.log'
  }
, './node.pid'
, function (err, pid) {
  if (err) {
    console.log('Error starting daemon: \n', err);
    return process.exit(-1);
  }
  console.log('Daemonized successfully with pid: ' + pid);

  // Your Application Code goes here
});

Останнім часом я також використовую mon (1) від TJ Holowaychuk для запуску та керування простими програмами вузлів.


12

Я використовую Supervisor для розробки. Це просто працює. Коли ви коли-небудь вносите зміни до .js-файлу, Supervisor автоматично перезавантажує додаток із тими змінами.

Ось посилання на його сторінку Github

Встановити:

sudo npm встановити супервізор -g

Ви можете легко переглядати інші розширення за допомогою -e. Іншою командою, яку я часто використовую, є -i для ігнорування певних папок.

Ви можете використовувати nohup і supervisor, щоб змусити додаток для вузла працювати у фоновому режимі навіть після виходу з системи.

Судо Нохуп Супервайзор myapp.js &


1
Я думаю, що на практиці керівник є кращим варіантом, ніж більшість модулів демона, особливо це використовується в поєднанні з веб-кукією для перевірки оновлень.
Ієн Коллінз

Я другий цей. Якщо ви зміните файли PHP, чи перезапустите сервер Apache або Nginx? Точно ні. Тоді навіщо турбуватися перезапустити весь сервер Node.js навіть просто змінити один рядок коду? Хоча це може бути не найкращим рішенням, при оренді у Supervisor вам не потрібно турбуватися про процес перезавантаження (насправді перезапуск все ще відбувається).
Чжан Базз

7

Node.js як фонова служба в WINDOWS XP

Установка:

  1. Встановіть WGET http://gnuwin32.sourceforge.net/packages/wget.htm через виконувану програму інсталятора
  2. Встановити GIT http://code.google.com/p/msysgit/downloads/list за допомогою виконавчого інструмента для встановлення
  3. Встановіть NSSM http://nssm.cc/download/?page=download за допомогою копіювання nnsm.exe у папку% windir% / system32
  4. Створіть c: \ node \ helloworld.js

    // http://howtonode.org/hello-node
    var http = require('http');
    var server = http.createServer(function (request, response) {
        response.writeHead(200, {"Content-Type": "text/plain"});
        response.end("Hello World\n");
    });
    server.listen(8000);
    console.log("Server running at http://127.0.0.1:8000/");
  5. Відкрийте командну консоль і введіть наступне (setx тільки якщо встановлений Resource Kit)

    C:\node> set path=%PATH%;%CD%
    C:\node> setx path "%PATH%"
    C:\node> set NODE_PATH="C:\Program Files\nodejs\node_modules"
    C:\node> git config --system http.sslcainfo /bin/curl-ca-bundle.crt    
    C:\node> git clone --recursive git://github.com/isaacs/npm.git    
    C:\node> cd npm    
    C:\node\npm> node cli.js install npm -gf   
    C:\node> cd ..    
    C:\node> nssm.exe install node-helloworld "C:\Program Files\nodejs\node.exe" c:\node\helloworld.js    
    C:\node> net start node-helloworld
  6. Вишуканий пакетний смакота - це створити c: \ node \ ServiceMe.cmd

    @echo off
    nssm.exe install node-%~n1 "C:\Program Files\nodejs\node.exe" %~s1
    net start node-%~n1
    pause

Управління сервісом:

  • Самі сервіси тепер доступні через Start-> Run-> services.msc або через Start-> Run-> MSCONFIG-> Services (і встановіть прапорець «Сховати всі служби Microsoft»).
  • Сценарій буде префіксувати кожен вузол, створений за допомогою пакетного сценарію, з 'node-'.
  • Так само їх можна знайти в реєстрі: " HKLM \ SYSTEM \ CurrentControlSet \ Services \ node-xxxx "

7

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

nodejs scriptname.js & не спрацювало, тому що, схоже, nodejs збиває &, і тому ця річ не дозволила мені продовжувати використовувати термінал, не вмираючи scriptname.js.

Але я вклав nodejs scriptname.jsфайл .sh і nohup sh startscriptname.sh &працював.

Однозначно не виробнича річ, але вона вирішує проблему "мені потрібно продовжувати використовувати свій термінал і не хочу запускати 5 різних терміналів".


4

Якщо ви працюєте з nodejs на сервері Linux, я думаю, що це найкращий спосіб.

Створіть сервісний скрипт і скопіюйте в /etc/init/nodejs.conf

запуск сервісу: sudo service nodejs start

стоп-сервіс: sudo service nodejs stop

Сценарій обслуговування

description "DManager node.js server - Last Update: 2012-08-06"
author      "Pedro Muniz - pedro.muniz@geeklab.com.br"

env USER="nodejs" #you have to create this user 
env APPNAME="nodejs" #you can change the service name
env WORKDIR="/home/<project-home-dir>" #set your project home folder here
env COMMAND="/usr/bin/node <server name>" #app.js ?

# used to be: start on startup
# until we found some mounts weren't ready yet while booting:
start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

pre-start script
    sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/$APPNAME.log
end script

script
    # Not sure why $HOME is needed, but we found that it is:
    export HOME="<project-home-dir>"  #set your project home folder here
    export NODE_PATH="<project node_path>"

    #log file, grant permission to nodejs user
    exec start-stop-daemon --start --make-pidfile --pidfile /var/run/$APPNAME.pid --chuid $USER --chdir $WORKDIR --exec $COMMAND >> /var/log/$APPNAME.log 2>&1
end script

post-start script
   # Optionally put a script here that will notifiy you node has (re)started
   # /root/bin/hoptoad.sh "node.js has started!"
end script

pre-stop script
    sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/$APPNAME.log
end script

4

Червень 2017 року: Оновлення
для Linux: (Червона шапочка). Попередні коментарі для мене не працюють. Це працює для мене на веб-службі Amazon - Red Hat 7. Сподіваюся, це працює для когось там.

A. Create the service file 
sudo vi /etc/systemd/system/myapp.service
[Unit]
Description=Your app
After=network.target

[Service]
ExecStart=/home/ec2-user/meantodos/start.sh
WorkingDirectory=/home/ec2-user/meantodos/

[Install]
WantedBy=multi-user.target

B. Create a shell file
/home/ec2-root/meantodos/start.sh
#!/bin/sh -
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
npm start

then:
chmod +rx /home/ec2-root/meantodos/start.sh
(to make this file executable)

C. Execute the Following

sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl status myapp

(If there are no errors, execute below.  Autorun after server restarted.)
chkconfig myapp -add

дуже цікаво, мені просто цікаво, iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080що він робить. Чи можете ви мені детальніше розповісти. Я не впевнений , але я думаю , що він перенаправляє трафік 80на 8080якому вузол сервера прослуховує, НЕ так?
Шакіба Моширі

3

використовуйте nssm найкраще рішення для Windows, просто завантажте nssm , відкрийте cmd у каталог і введіть nssm

nssm install <service name> <node path> <app.js path> 

eg: nssm install myservice "C:\Program Files\nodejs" "C:\myapp\app.js" 

це встановить нову службу Windows, яка буде вказана на services.msc, звідти ви можете запустити або зупинити службу, ця служба автоматично запуститься, і ви можете налаштувати перезапуск, якщо вона не працює.


2

Щоб округлити різні запропоновані варіанти, ось ще один: daemonкоманда в GNU / Linux, про яку ви можете прочитати тут: http://libslack.org/daemon/manpages/daemon.1.html . (вибачте, якщо про це вже згадувалося в одному з коментарів вище).



1

хтось помітив тривіальну помилку позиції "2> & 1"?

2>&1 >> file

має бути

>> file 2>&1

1

Я використовую tmux для декількох середовищ розробки вікон / панелей на віддалених хостах. Це дуже просто від'єднати та тримати процес у фоновому режимі. Погляньте на tmux


1

Для людей, які використовують новіші версії модуля npm демона - вам потрібно передавати дескриптори файлів замість рядків:

var fs = require('fs');
var stdoutFd = fs.openSync('output.log', 'a');
var stderrFd = fs.openSync('errors.log', 'a');
require('daemon')({
    stdout: stdoutFd, 
    stderr: stderrFd
});

0

PM2 - менеджер виробничих процесів для додатків Node.js із вбудованим балансиром навантаження. Це дозволяє зберегти програми живими назавжди, перезавантажувати їх без простоїв і полегшувати загальні завдання системного адміністратора. https://github.com/Unitech/pm2


серйозні проблеми споживання пам'яті! піти на phusion + nginx
Rizwan Patel

0

Я здивований, що ніхто не згадав Гувнора

Я намагався назавжди, pm2 і т. Д. Але, коли справа стосується міцного контролю та показників продуктивності на основі Інтернету, я визнав, що Guvnor є найкращим. Крім того, це також повністю відкритий ресурс.

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

Редагувати: Однак я не впевнений, чи працює він на Windows. Я використовував його лише на Linux.


4
Здається, нестабільним станом на 2017 рік. Будувати не вдалося. Жоден код не підштовхується за останній рік. Сумнівні.
азатар

0

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

Існує підтримка докера для Windows, macOS та більшості / основних дистрибутивів Linux. Встановлення докера на підтримувану платформу є досить прямим та добре зафіксованим. Налаштування програми Node.js настільки ж просто, як помістити її в контейнер і запустити цей контейнер, при цьому переконавшись, що він перезапущений після відключення.

Створіть зображення контейнера

Припустимо, що ваша програма доступна в / home / me / my-app на цьому сервері, створіть текстовий файл Dockerfile у папці / home / me / my-app із вмістом, подібним до цього:

FROM node:lts-alpine
COPY /my-app /app
CMD ["/app/server.js"]

Створіть зображення за допомогою такої команди:

docker build -t myapp-as-a-service /home/me

Примітка. Останній параметр - це вибір папки, що містить цей Dockerfile замість самого Dockerfile. Ви можете вибрати інший за допомогою опції -f .

Запустіть контейнер

Використовуйте цю команду для запуску контейнера:

docker run -d --restart always -p 80:3000 myapp-as-a-service

Ця команда припускає, що ваша програма прослуховує порт 3000, і ви хочете, щоб вона була виставлена ​​на порт 80 вашого хоста.

Це точно обмежений приклад, але це хороший вихідний пункт.


0

Якщо ви використовуєте pm2, ви можете використовувати його із autorestartвстановленим параметром false:

екологічна система $ pm2

Це створить зразок ecosystem.config.js:

module.exports = {
  apps: [
    {
      script: './scripts/companies.js',
      autorestart: false,
    },
    {
      script: './scripts/domains.js',
      autorestart: false,
    },
    {
      script: './scripts/technologies.js',
      autorestart: false,
    },
  ],
}

$ pm2 запустити ecosystem.config.js


-1

Ця відповідь є досить пізньою для партії, але я виявив, що найкращим рішенням було написати скрипт оболонки, який використовував screen -dmSі nohupкоманди, і команди.

screen -dmS newScreenName nohup node myserver.js >> logfile.log

Я також додаю >> logfileбіт в кінці, щоб я міг легко зберігати console.log()оператори вузла .

Чому я використовував сценарій оболонки? Добре я також додав у операторі if, який перевіряв, чи вже node myserver.jsпроцес запущений.

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


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