Question Comment exécuter le processus en arrière-plan et ne jamais mourir?


Je me connecte au serveur Linux via un mastic 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 maintenir le processus en vie même si le terminal est 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 internet, le processus du serveur s'arrête immédiatement.

Y a-t-il quelque chose à faire dans Putty?


Edit 2 (le février 2012)

Il y a un node.js module, pour toujours. Il exécutera le serveur node.js en tant que service démon.


442
2018-01-25 17:53


origine


Réponses:


Solution simple (Si vous ne souhaitez pas revenir au processus, il vous suffit de continuer à le faire):

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 vous reconnecter en exécutant screen -r

Considérez également la nouvelle alternative à l'écran, tmux.


476
2018-01-25 17:55



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

  1. nohup veux dire: Ne terminez pas ce processus même lorsque le stty est coupé de.
  2. > /dev/null veux dire: stdout va dans / dev / null (qui est un mannequin appareil qui n'enregistre aucune sortie). 
  3. 2>&1 veux dire: stderr va aussi à 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écutez cette commande en tâche de fond.

1047
2017-08-08 01:48



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

Commencez votre session d'écran en premier:

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 lister toutes les sessions en screen -lset attacher à certains par screen -r 20673.pts-0.srv commande, où 0673.pts-0.srv est une liste d'entrée.


131
2018-06-28 06:40



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

Spécialement la solution écran / tmux, qui devrait vraiment être considérée comme amateur Solution. Screen et Tmux ne sont pas destinés à faire fonctionner des processus, mais à multiplexer des sessions de terminal. C'est bien, lorsque vous exécutez un script sur votre serveur et que vous voulez 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 les choses continuent, 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

Un 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

Scripts Init:

Je ne vais pas entrer dans les détails sur la façon d'écrire un script d'initialisation, car je ne suis pas un expert en la matière et ce serait trop long pour cette réponse, mais fondamentalement, ce sont des scripts shell simples, déclenchés par des événements de système d'exploitation. Vous pouvez en lire plus à ce sujet ici

Docker:

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

Voici un exemple de fichier Docker (à partir 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" ]

Puis 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. Toujours utiliser l'outil approprié pour le travail. Cela vous épargnera beaucoup de maux de tête et pendant des heures!


101
2018-03-18 18:02



une autre solution désavouer le travail

$ nohup node server.js &
[1] 1711
$ disown -h %1

21
2018-04-11 08:39



nohup permettra au programme de continuer même après la mort du terminal. J'ai effectivement eu des situations où nohup empêche la session SSH de se terminer correctement, vous devez donc rediriger également les entrées:

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

Selon comment nohup est configuré, vous devrez peut-être également rediriger la sortie standard et l’erreur standard vers les fichiers.


12
2018-01-25 17:56



J'ai cette fonction dans mon fichier de shell rc, 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"

5
2018-05-22 19:48



$ disown node server.js &

Il supprimera la commande de la liste des tâches active et enverra la commande à l'arrière-plan


4
2017-07-30 17:09



Nohup et screen offrent des solutions légères pour exécuter Node.js en arrière-plan. 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 réalisé par Unitech.


4
2017-09-21 18:44



Avez-vous lu sur le Nohup commander?


3
2018-01-25 17:54



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 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 vars 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 python pour mon wiki wikimedia:

...
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
}

En plus de définir des vars, j'ai dû remplacer do_stop_cmd parce que Python remplace l'exécutable, le service ne s'est pas arrêté correctement.


1
2018-06-05 07:48