web-dev-qa-db-fra.com

Comment exécuter Node.js en tant que processus d'arrière-plan et ne jamais mourir?

Je me connecte au serveur Linux via PuTTY SSH. J'ai essayé de l'exécuter en tâche de fond comme ceci:

$ node server.js &

Cependant, après 2,5 heures, le terminal devient inactif et le processus meurt. Y a-t-il un moyen de garder le processus en vie même avec le terminal déconnecté?


Modifier 1

En fait, j'ai essayé Nohup, mais dès que je ferme le terminal PuTTY SSH ou que je débranche mon ordinateur, le processus du serveur s'arrête immédiatement. 

Dois-je faire quelque chose à Putty?


Edit 2 (le févr. 2012)

Il existe un module node.js, forever . Il exécutera le serveur node.js en tant que service démon. 

459
murvinlai

Solution simple (si vous n'êtes pas intéressé à revenir au processus, vous voulez juste qu'il continue à fonctionner): 

Nohup node server.js &

Solution puissante (vous permet de vous reconnecter au processus s'il est interactif): 

screen

Vous pouvez ensuite vous détacher en appuyant sur Ctrl + a + d, puis rattacher en exécutant screen -r.

Pensez également à la nouvelle alternative à screen, tmux.

496
MK.

Nohup node server.js > /dev/null 2>&1 &

  1. Nohup signifie: Ne terminez pas ce processus même lorsque le stty est coupéoff.
  2. > /dev/null signifie: stdout va à/dev/null (qui est un périphérique factice qui n'enregistre aucune sortie).  
  3. 2>&1 signifie: stderr va également à la sortie standard (qui est déjà redirigée vers /dev/null). Vous pouvez remplacer & 1 par un chemin de fichier pour conserver un journal des erreurs, par exemple: 2>/tmp/myLog
  4. & à la fin signifie: exécuter cette commande en tâche de fond.
1083
Yoichi

Vous devriez vraiment essayer d'utiliser screen. C'est un peu plus compliqué que de simplement faire Nohup long_running &, mais de comprendre l'écran une fois que vous ne revenez plus jamais. 

Commencez votre session d’écran au début:

user@Host:~$ screen

Exécutez tout ce que vous voulez:

wget http://mirror.yandex.ru/centos/4.6/isos/i386/CentOS-4.6-i386-binDVD.iso

Appuyez sur ctrl + A puis sur d. Terminé. Votre session continue en arrière-plan.

Vous pouvez répertorier toutes les sessions par screen -ls et en associer à certaines par la commande screen -r 20673.pts-0.srv, où 0673.pts-0.srv est une liste d'entrées.

135
Alex Povar

C'est une vieille question, mais elle est bien classée sur Google. Je ne peux presque pas croire aux réponses les plus votées, car exécuter un processus node.js dans une session d'écran, avec le & ou même avec l'indicateur Nohup - tous - ne sont que des solutions de contournement.

Spécialement la solution screen/tmux, qui devrait vraiment être considérée comme une solution amateur. Screen et Tmux ne sont pas destinés à maintenir les processus en cours d'exécution, mais à multiplexer des sessions de terminal. C'est bien, lorsque vous exécutez un script sur votre serveur et que vous souhaitez vous déconnecter. Mais pour un serveur node.js, vous ne voulez pas que votre processus soit associé à une session de terminal. C'est trop fragile. Pour que tout fonctionne correctement, vous devez démoniser le processus!

Il y a plein de bons outils pour le faire.

PM2: http://pm2.keymetrics.io/

# basic usage
$ npm install pm2 -g
$ pm2 start server.js

# you can even define how many processes you want in cluster mode:
$ pm2 start server.js -i 4

# you can start various processes, with complex startup settings
# using an ecosystem.json file (with env variables, custom args, etc):
$ pm2 start ecosystem.json

Le gros avantage que je vois en faveur de PM2 est qu’il peut générer le script de démarrage du système pour que le processus persiste entre les redémarrages:

$ pm2 startup [platform]

platform peut être ubuntu|centos|redhat|gentoo|systemd|darwin|Amazon.

forever.js: https://github.com/foreverjs/forever

# basic usage
$ npm install forever -g
$ forever start app.js

# you can run from a json configuration as well, for
# more complex environments or multi-apps
$ forever start development.json

Init scripts:

Je ne vais pas entrer dans les détails sur la manière d'écrire un script init, car je ne suis pas un expert en la matière et que la réponse serait trop longue, mais il s'agit en réalité de simples scripts Shell, déclenchés par des événements de système d'exploitation. Vous pouvez en lire plus à ce sujet ici

Docker:

Il suffit d’exécuter votre serveur dans un conteneur Docker avec l’option -d et, voilá, vous avez un serveur node.js démonisé!

Voici un exemple de fichier Docker (de node.js guide officiel ):

FROM node:argon

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install

# Bundle app source
COPY . /usr/src/app

EXPOSE 8080
CMD [ "npm", "start" ]

Ensuite, construisez votre image et exécutez votre conteneur:

$ docker build -t <your username>/node-web-app .
$ docker run -p 49160:8080 -d <your username>/node-web-app

J'espère que cela aidera quelqu'un à atterrir sur cette page. Utilisez toujours l'outil approprié pour le travail. Cela vous évitera beaucoup de maux de tête et plus d'heures!

112
Victor Schröder

une autre solution renie le travail

$ Nohup node server.js &
[1] 1711
$ disown -h %1
22
myururdurmaz

Nohup permettra au programme de continuer même après la mort du terminal. Il y a eu des situations où Nohup empêche la session SSH de se terminer correctement. Vous devez donc également rediriger les entrées:

$ Nohup node server.js </dev/null &

Selon la configuration de Nohup, vous devrez peut-être également rediriger la sortie standard et l'erreur standard vers des fichiers.

13
Daniel Gallagher

J'ai cette fonction dans mon fichier rc Shell, basée sur la réponse de @ Yoichi:

Nohup-template () {
    [[ "$1" = "" ]] && echo "Example usage:\nnohup-template urxvtd" && return 0
    Nohup "$1" > /dev/null 2>&1 &
}

Vous pouvez l'utiliser de cette façon:

Nohup-template "command you would execute here"
6
thiagowfx
$ disown node server.js &

Il va supprimer la commande de la liste des tâches actives et envoyer la commande en arrière-plan 

5
Skynet

Nohup et screen offrent d'excellentes solutions d'éclairage pour exécuter Node.js en arrière-plan. Le gestionnaire de processus Node.js ( PM2 ) est un outil pratique pour le déploiement. Installez-le avec npm globalement sur votre système: 

npm install pm2 -g

exécuter une application Node.js en tant que démon:

pm2 start app.js

Vous pouvez éventuellement le lier à Keymetrics.io à un SAAS de surveillance fabriqué par Unitech.

5
Donald Derek

Avez-vous lu sur la commande Nohup ?

4
S.Lott

Pour Ubuntu, j'utilise ceci:

(exec PROG_SH &>/dev/null &)

cordialement

2
David Lopes

Pour exécuter la commande en tant que service système sur Debian avec sysv init:

Copiez le script squelette et adaptez-le à vos besoins. Tout ce que vous avez à faire est probablement de définir des variables. Votre script héritera des valeurs par défaut fines de /lib/init/init-d-script, si quelque chose ne correspond pas à vos besoins - remplacez-le dans votre script. Si quelque chose ne va pas, vous pouvez voir les détails dans la source /lib/init/init-d-script. Les variables obligatoires sont DAEMON et NAME. Le script utilisera start-stop-daemon pour exécuter votre commande. Dans START_ARGS, vous pouvez définir des paramètres supplémentaires de start-stop-daemon à utiliser.

cp /etc/init.d/skeleton /etc/init.d/myservice
chmod +x /etc/init.d/myservice
nano /etc/init.d/myservice

/etc/init.d/myservice start
/etc/init.d/myservice stop

C’est comme ça que je lance des trucs en python pour mon wiki:

...
DESC="mediawiki articles converter"
DAEMON='/home/mss/pp/bin/nslave'
DAEMON_ARGS='--cachedir /home/mss/cache/'
NAME='nslave'
PIDFILE='/var/run/nslave.pid'
START_ARGS='--background --make-pidfile --remove-pidfile --chuid mss --chdir /home/mss/pp/bin'

export PATH="/home/mss/pp/bin:$PATH"

do_stop_cmd() {
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 \
        $STOP_ARGS \
        ${PIDFILE:+--pidfile ${PIDFILE}} --name $NAME
    RETVAL="$?"
    [ "$RETVAL" = 2 ] && return 2
    rm -f $PIDFILE
    return $RETVAL
}

Outre le paramétrage de vars, je devais remplacer do_stop_cmd car python remplaçait l'exécutable, le service ne s'arrêtait donc pas correctement.

2
user3132194

Outre les solutions intéressantes ci-dessus, je mentionnerais également les outils de supervision et de surveillance qui permettent de lancer le processus, de surveiller sa présence et de le démarrer s'il meurt. Avec 'monit', vous pouvez aussi lancer des contrôles actifs, comme vérifier si le processus répond à la requête http

2

Essayez ceci pour une solution simple

cmd & sortie

0
Hunter Frazier