Come posso eseguire un'app node.js come servizio in background?


503

Da quando questo post ha ricevuto molta attenzione nel corso degli anni, ho elencato le migliori soluzioni per piattaforma in fondo a questo post.


Post originale :

Voglio che il mio server node.js venga eseguito in background, ovvero: quando chiudo il mio terminale voglio che il mio server continui a funzionare. Ho cercato su Google e ho creato questo tutorial , tuttavia non funziona come previsto. Quindi, invece di usare quello script daemon, ho pensato di usare solo il reindirizzamento dell'output (la 2>&1 >> fileparte), ma anche questo non esce - ho una riga vuota nel mio terminale, come se fosse in attesa di output / errori.

Ho anche provato a mettere il processo in background, ma non appena chiudo il mio terminale anche il processo viene interrotto.

Quindi, come posso lasciarlo in esecuzione quando spengo il mio computer locale?


Le migliori soluzioni :


3
Penso che intendesse chiudere il suo sistema locale
Kamal Reddy,

46
intendeva chiudere una sessione ssh che termina il compito
giovedì

5
github.com/Unitech/pm2 è un gestore di processi altamente mantenuto e molto stabile, provalo!
Unitech,

Risposte:


435

Copia della mia risposta da Come eseguo un'applicazione Node.js come processo proprio?

Risposta del 2015 : quasi ogni distribuzione Linux viene fornita con systemd, il che significa che per sempre, monit, PM2, ecc. Non sono più necessari: il tuo sistema operativo gestisce già queste attività .

Crea un myapp.servicefile (sostituendo "myapp" con il nome della tua app, ovviamente):

[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

Nota se sei nuovo su Unix: /var/www/myapp/app.js dovrebbe avere #!/usr/bin/env nodela prima riga.

Copia il tuo file di servizio in /etc/systemd/system.

Inizia con systemctl start myapp.

Attivalo per l'avvio con systemctl enable myapp.

Vedi i log con journalctl -u myapp

Questo è tratto da Come implementiamo le app nodo su Linux, edizione 2018 , che include anche i comandi per generare un AWS / DigitalOcean / Azure CloudConfig per costruire server Linux / nodo (incluso il .servicefile).


4
All'inizio, quando disponibile è anche una buona soluzione. in entrambi i casi, non dovresti fare affidamento su un processo nodejs per mantenere in esecuzione il demone nodejs. Questo è un compito solo per il sistema operativo. killall nodejs e per sempre non c'è più ...
131,

19
Si noti che è anche possibile eseguire i servizi di systemd come utente. Vedi ad esempio questo tutorial . Puoi inserire il tuo file di servizio ~/.config/systemd/user, avviarlo con systemctl --user start myapp, abilitarlo con systemctl --user enable myapp.
cdauth,

5
Grazie per questa risposta Questo è quello che voglio puro e chiaro
bmavus

5
Ho accettato questa risposta invece della risposta "per sempre", poiché penso anche che sia il modo migliore per farlo. Ci sono risposte simili per Mac e Windows, ma suppongo che la maggior parte stia cercando una soluzione Linux.
Peter Kruithof,

11
in EC2 percorso AMI / etc / systemd / system non esiste. Puoi indicare qual è il percorso corretto nell'AMI Linux AWS EC2?
René Michel,

241

È possibile utilizzare Forever, un semplice strumento CLI per garantire che un determinato script del nodo venga eseguito continuamente (ovvero per sempre): https://www.npmjs.org/package/forever


4
Con l'ultimo nodo non sono stato in grado di farlo arrestare un'app tramite il nome dello script (errore) - anche - in genere si comportava male (era su OS-X) - tutto creato dalla fonte, stranamente. Ha lasciato le cose in cattivo stato, non mi ha riempito di fiducia.
Michael Neale,

4
Mentre nohup fa il trucco, per sempre è una soluzione migliore in quanto demonizza il processo. Ottimo strumento!
Peter Kruithof,

5
A proposito, qui è disponibile un tutorial più semplice: mantenere un server node.js attivo con Forever
kehers,

2
Ho usato Forever per un po ', all'inizio tutto sembra ok ma poi è successo un disastro. Per sempre non è più possibile gestire i processi e lasciarli correre selvaggi. Ancora lottando per trovare una soluzione migliore. Proverò a usare nohup
LN

5
Geoffrey: no, dovrai farlo forever start /path/to/yourApp.jsnello script di avvio del tuo server.
mikermcneil,

215

AGGIORNAMENTO - Come menzionato in una delle risposte di seguito, PM2 ha alcune funzionalità davvero carine che mancano da sempre. Valuta di usarlo.

Risposta originale

Usa nohup :

nohup node server.js &

EDIT Volevo aggiungere che la risposta accettata è davvero la strada da percorrere. Uso per sempre le istanze che devono rimanere in piedi. Mi piace farlo npm install -g forever, è nel percorso del nodo e poi bastaforever start server.js


136
parte interessante da sapere: nohuprappresenta ciò no hangupche viene dai vecchi tempi, dove volevi mantenere un processo attivo quando "riattivi" il tuo modem.
jAndy,

1
al giorno d'oggi è piuttosto il nome del segnale 1 che i processi ricevono per avvisare che l'utente ha chiuso la shell (o ha perso la connessione modem, ovviamente: P)
lapo

7
Non è la soluzione migliore perché se l'app rileva un errore non rilevato il processo del nodo verrà chiuso e non riavviato. Tuttavia, è un'opzione ragionevole per lo sviluppo.
Andy E,

1
Come aggiungerei variabili ambientali a quello? es: PORT = 80 node server.js
Pardoner

1
Dai un'occhiata a questa risposta da SO - stackoverflow.com/questions/8825460/…
NG.

67

Questo potrebbe non essere il modo accettato, ma lo faccio con lo schermo, specialmente durante lo sviluppo perché posso ripristinarlo e ingannarlo se necessario.

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

Lo schermo si staccherà e sopravviverà alla disconnessione. Quindi puoi tornare indietro facendo schermo -r. Fai clic sul manuale dello schermo per maggiori dettagli. Puoi nominare le schermate e quant'altro, se lo desideri.


2
Inoltre, tmux è carino. Funziona come lo schermo (CTRL-B è predefinito invece di CTRL-A, ma è configurabile). Tmux ha pannelli (schermi divisi).
snapfractalpop

1
lo schermo ha anche pannelli
Billy Moon

lo sto usando da un paio di settimane per un'app meteorite. `$ screen -dr 'per staccare e ricollegare potrebbe essere richiesto di tanto in tanto.
Vinay Vemula,

Per me il modo più semplice per fare il lavoro. Ma sono d'accordo, non la soluzione migliore
Pomme De Terre,

Questa soluzione non persiste dopo un riavvio del sistema
wnasich

60

Aggiornamento 2016: la serie node-windows / mac / linux utilizza un'API comune su tutti i sistemi operativi, quindi è assolutamente una soluzione rilevante. Però; node-linux genera file init systemv. Poiché systemd continua a crescere in popolarità, è realisticamente un'opzione migliore su Linux. Il PR è il benvenuto se qualcuno vuole aggiungere il supporto di systemd a node-linux :-)

Discussione originale:

Questo è un thread piuttosto vecchio ora, ma node-windows offre un altro modo per creare servizi in background su Windows. È vagamente basato sul nssmconcetto di utilizzare un exewrapper attorno allo script del nodo. Però; utilizza winsw.exeinvece e fornisce un wrapper di nodo configurabile per un controllo più granulare sull'avvio / arresto del processo in caso di errori. Questi processi sono disponibili come qualsiasi altro servizio:

inserisci qui la descrizione dell'immagine

Il modulo esegue anche la registrazione di alcuni eventi:

inserisci qui la descrizione dell'immagine

La demonizzazione dello script viene eseguita tramite codice. Per esempio:

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();

Il modulo supporta cose come il riavvio dei limiti (quindi gli script errati non fanno il tubo sul server) e aumentano gli intervalli di tempo tra i riavvii.

Poiché i servizi nodo-windows funzionano come qualsiasi altro, è possibile gestire / monitorare il servizio con qualsiasi software già in uso.

Infine, non ci sono makedipendenze. In altre parole, un semplice npm install -g node-windowsfunzionerà. Non è necessario Visual Studio, .NET o node-gyp magic per installarlo. Inoltre, ha la licenza MIT e BSD.

In piena divulgazione, sono l'autore di questo modulo. È stato progettato per alleviare l'esatta sofferenza dell'OP, ma con una più stretta integrazione nella funzionalità già fornita dal sistema operativo. Spero che i futuri spettatori con questa stessa domanda lo trovino utile.


8
Ora l'ho portato su node-mac , fornendo la stessa funzionalità su OSX.
Corey,

1
Sono arrivato al punto di pianificare un paio di programmi Node e di prendere la decisione di scegliere node-windows, Forever o Kue. Mi sposto verso le finestre dei nodi ma vorrei capire perché non usare Forever o Kue quando voglio pianificare e monitorare una dozzina di programmi di nodi. Alcuni corrono per sempre. Bisogno anche di monitoraggio.
Christiaan Westerbeek,

5
Node-windows utilizza il sistema operativo nativo per la gestione dei servizi in background e il registro eventi nativo per la registrazione. Per sempre ha il proprio monitoraggio e registrazione personalizzati. Ho scritto un articolo su questo su medium.com/p/2a602ea657a2 Sembra che tu debba programmare i tuoi script, non eseguirli sempre come servizi in background. Progetti come Kue e Agenda sono progettati per questo. Node-windows e Forever hanno uno scopo diverso.
Corey,

1
@Corey, come eseguo l'esempio incluso in node-mac ?, dal terminale, ho provato il nodo install.js, ma non sembra raccogliere helloworld.js
Edwin Ikechukwu Okonkwo,

@Edwin - Potrebbe essere meglio aprire una nuova domanda con maggiori dettagli sul problema, incluso il codice che si sta utilizzando.
Corey,

28

AGGIORNAMENTO : ho aggiornato per includere le ultime da pm2:

per molti casi d'uso, l'uso di un servizio systemd è il modo più semplice e appropriato per gestire un processo del nodo. per coloro che eseguono numerosi processi di nodo o eseguono in modo indipendente microservizi di nodo in un singolo ambiente, pm2 è uno strumento più completo.

https://github.com/unitech/pm2

http://pm2.io

  • ha una funzione di monitoraggio davvero utile -> piuttosto 'gui' per il monitoraggio da riga di comando di più processi con pm2 monito elenco processi conpm2 list
  • gestione organizzata dei log -> pm2 logs
  • altre cose:
    • Configurazione del comportamento
    • Supporto per la mappa di origine
    • PaaS compatibile
    • Guarda e ricarica
    • Sistema di moduli
    • Ricarica massima della memoria
    • Modalità cluster
    • Ricarica a caldo
    • Flusso di lavoro di sviluppo
    • Script di avvio
    • Completamento automatico
    • Flusso di lavoro di distribuzione
    • Monitoraggio keymetrics
    • API

20

Se si desidera semplicemente eseguire lo script ininterrottamente fino al completamento, è possibile utilizzare nohupcome già indicato nelle risposte qui. Tuttavia, nessuna delle risposte fornisce un comando completo che registra stdine stdout.

nohup node index.js >> app.log 2>&1 &
  • Il >>mezzo si aggiunge a app.log.
  • 2>&1si assicura che anche gli errori vengano inviati stdoute aggiunti a app.log.
  • Il finale &assicura che il terminale corrente sia disconnesso dal comando in modo da poter continuare a lavorare.

Se si desidera eseguire un server nodo (o qualcosa che dovrebbe avviarsi al riavvio del server) è necessario utilizzare systemd / systemctl .


1
migliore risposta m8.
bholagabbar,

1
ben spiegato
Prakhar Prakash Bhardwaj

19

Se stai eseguendo OSX, il modo più semplice per produrre un vero processo di sistema è utilizzare launchdper avviarlo.

Crea un plist come questo e inseriscilo in / Library / LaunchDaemons con il nome top-level-domain.your-domain.application.plist(devi essere root quando lo posizioni):

<?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>

Al termine, rilascia questo (come root):

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

e stai correndo.

E sarai ancora in esecuzione dopo un riavvio.

Per altre opzioni nella lista, guarda la pagina man qui: https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html


Con quale utente verrà eseguito il servizio? C'è un modo per impostare l'utente?
rjmunro,

15

Prova a eseguire questo comando se stai usando nohup -

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

È inoltre possibile utilizzare per sempre per avviare il server

forever start -c "npm start" ./ 

PM2 supporta anche npm start

pm2 start npm -- start

2
grazie, ha funzionato perfettamente. pm2 start npm -- start
yadavr,

13

Sto semplicemente usando il modulo demone 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
});

Ultimamente sto usando anche mon (1) di TJ Holowaychuk per avviare e gestire semplici app di nodi.


12

Uso Supervisor per lo sviluppo. Funziona e basta. Ogni volta che apporti modifiche a un file .js, Supervisor riavvia automaticamente l'app con tali modifiche caricate.

Ecco un link alla sua pagina Github

Installa:

sudo npm installa supervisore -g

Puoi facilmente farlo guardare altre estensioni con -e. Un altro comando che uso spesso è -i per ignorare determinate cartelle.

Puoi usare nohup e supervisore per far funzionare l'app del tuo nodo in background anche dopo esserti disconnesso.

sudo nohup supervisore myapp.js e


1
Penso che in pratica il supervisore sia un'opzione migliore rispetto alla maggior parte dei moduli daemon, utilizzato in particolare in combinazione con un webhook per il checkout degli aggiornamenti.
Iain Collins,

Io secondo questo. Se cambi file PHP, riavvieresti il ​​server Apache o Nginx? Sicuramente no. Allora perché preoccuparsi di riavviare l'intero server Node.js anche solo cambiare una riga di codice? Anche se questa potrebbe non essere la soluzione migliore, in affitto con il supervisore non è necessario preoccuparsi del processo di riavvio (in realtà il riavvio avviene ancora).
Zhang Buzz,

7

Node.js come servizio in background in WINDOWS XP

Installazione:

  1. Installa WGET http://gnuwin32.sourceforge.net/packages/wget.htm tramite il file eseguibile dell'installer
  2. Installa GIT http://code.google.com/p/msysgit/downloads/list tramite l'eseguibile del programma di installazione
  3. Installa NSSM http://nssm.cc/download/?page=download copiando nnsm.exe nella cartella% windir% / system32
  4. Crea 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. Apri la console di comando e digita quanto segue (setx solo se è installato 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. Un buono batch batch è quello di creare c: \ node \ ServiceMe.cmd

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

Gestione del servizio:

  • I servizi stessi sono ora accessibili tramite Start-> Esegui-> services.msc o tramite Start-> Esegui-> MSCONFIG-> Servizi (e seleziona "Nascondi tutti i servizi Microsoft").
  • Lo script anteporrà ogni nodo creato tramite lo script batch con 'nodo-'.
  • Allo stesso modo possono essere trovati nel registro: " HKLM \ SYSTEM \ CurrentControlSet \ Services \ node-xxxx "

7

La risposta accettata è probabilmente la migliore risposta di produzione, ma per un hack rapido che fa il lavoro di sviluppo, ho trovato questo:

nodejs scriptname.js & non ha funzionato, perché nodejs sembrava inghiottire il &, e quindi la cosa non mi ha permesso di continuare a usare il terminale senza morire scriptname.js.

Ma ho inserito nodejs scriptname.jsun file .sh e ho nohup sh startscriptname.sh &funzionato.

Sicuramente non è una cosa di produzione, ma risolve il problema "Devo continuare a utilizzare il mio terminale e non voglio avviare 5 terminali diversi".


4

Se stai eseguendo nodejs nel server Linux, penso che questo sia il modo migliore.

Creare uno script di servizio e copiarlo in /etc/init/nodejs.conf

servizio di avvio: servizio sudo nodejs start

servizio di arresto: servizio sudo nodejs stop

Sceneggiatura Sevice

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

Aggiornamento di giugno 2017:
soluzione per Linux: (cappello rosso). I commenti precedenti non funzionano per me. Questo funziona per me su Amazon Web Service - Red Hat 7. Spero che funzioni per qualcuno là fuori.

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

molto interessante, sono solo curioso di sapere iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080cosa fa. Potete darmi maggiori dettagli per favore. Non sono sicuro, ma penso che reindirizza il traffico da 80a 8080quale nodo del server ascolti, giusto?
Shakiba Moshiri,

3

usa nssm la migliore soluzione per windows, basta scaricare nssm , aprire cmd nella directory nssm e digitare

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

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

questo installerà un nuovo servizio di Windows che sarà elencato su services.msc da lì puoi avviare o interrompere il servizio, questo servizio si avvierà automaticamente e puoi configurare il riavvio se fallisce.




1

qualcuno ha notato un banale errore nella posizione di "2> & 1"?

2>&1 >> file

dovrebbe essere

>> file 2>&1

1

Uso tmux per un ambiente di sviluppo a più finestre / pannelli su host remoti. È davvero semplice staccare e mantenere il processo in esecuzione in background. Dai un'occhiata a tmux


1

Per le persone che usano versioni più recenti del modulo demone npm - è necessario passare descrittori di file anziché stringhe:

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 è un gestore di processi di produzione per applicazioni Node.js con un bilanciamento del carico integrato. Ti consente di mantenere in vita le applicazioni per sempre, di ricaricarle senza tempi di inattività e di facilitare le attività di amministrazione del sistema comuni. https://github.com/Unitech/pm2


gravi problemi di consumo di memoria! vai per phusion + nginx
Rizwan Patel

0

Sono sorpreso che nessuno abbia menzionato Guvnor

Ho provato per sempre, pm2, ecc. Ma, quando si tratta di controllo solido e metriche delle prestazioni basate sul web, ho trovato Guvnor di gran lunga il migliore. Inoltre, è anche completamente open source.

inserisci qui la descrizione dell'immagine

Modifica: Tuttavia, non sono sicuro che funzioni su Windows. L'ho usato solo su Linux.


4
Sembra stantio a partire dal 2017. Build fallito. Nessun codice viene inviato nell'ultimo anno. Discutibile.
azatar,

0

Dato che mi manca questa opzione nell'elenco delle risposte fornite, vorrei aggiungere un'opzione ammissibile a partire dal 2020: docker o qualsiasi contenitore equivalente piattaforma . Oltre a garantire che l'applicazione funzioni in un ambiente stabile, ci sono ulteriori vantaggi in termini di sicurezza e una migliore portabilità.

Esiste il supporto docker per Windows, macOS e la maggior parte delle principali distribuzioni Linux. L'installazione della finestra mobile su una piattaforma supportata è piuttosto semplice e ben documentata. La configurazione di un'applicazione Node.js è semplice come metterla in un contenitore ed eseguire quel contenitore assicurandosi che venga riavviato dopo l'arresto.

Crea immagine contenitore

Supponendo che la tua applicazione sia disponibile in / home / me / my-app su quel server, crea un file di testo Dockerfile nella cartella / home / me / my-app con contenuti simili a questo:

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

Crea l'immagine usando il comando in questo modo:

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

Nota: l' ultimo parametro è selezionare la cartella contenente quel file Docker anziché il file Docker stesso. Puoi sceglierne uno diverso usando l'opzione -f .

Avvia contenitore

Utilizzare questo comando per avviare il contenitore:

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

Questo comando presuppone che la tua app sia in ascolto sulla porta 3000 e desideri che sia esposta sulla porta 80 del tuo host.

Questo è un esempio molto limitato, ma è un buon punto di partenza.


0

Se stai usando pm2, puoi usarlo con autorestartset su false:

$ pm2 ecosistema

Questo genererà un campione 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 avvia ecosystem.config.js


-1

Questa risposta è abbastanza tardi per la festa, ma ho scoperto che la soluzione migliore era scrivere uno script di shell che usasse entrambi i comandi screen -dmSe nohup.

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

Aggiungo anche il >> logfilebit alla fine in modo da poter facilmente salvare le console.log()istruzioni del nodo .

Perché ho usato uno script di shell? Bene, ho anche aggiunto un'istruzione if che ha verificato se il node myserver.jsprocesso era già in esecuzione.

In questo modo sono stato in grado di creare una singola opzione della riga di comando che mi consente sia di far funzionare il server sia di riavviarlo dopo aver apportato modifiche, il che è molto utile per lo sviluppo.


2
Ho riscontrato questo problema e sono abbastanza nuovo su Linux. Come lo faresti senza schermo o nohup?
Craig Norton,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.