Je me connecte au serveur Linux via putty SSH. J'ai essayé de l'exécuter en arrière-plan comme ceci:
$ node server.js &
Cependant, après 2,5 heures, le terminal devient inactif et le processus meurt. Existe-t-il de toute façon que je peux maintenir 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 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.
node.js
linux
background-process
murvinlai
la source
la source
exit
. Lorsque je ferme la fenêtre Putty, cela échoue.Réponses:
Solution simple (si vous n'êtes pas intéressé à revenir au processus, vous voulez juste qu'il continue à fonctionner):
Il y a aussi la
jobs
commande pour voir une liste indexée de ces processus en arrière-plan. Et vous pouvez tuer un processus en arrière-plan en exécutantkill %1
oukill %2
avec le nombre étant l'index du processus.Solution puissante (vous permet de vous reconnecter au processus s'il est interactif):
Vous pouvez ensuite vous détacher en appuyant sur Ctrl + a + d, puis rattacher en exécutant
screen -r
Considérez également la nouvelle alternative à screen, tmux.
la source
sudo bash
.nohup node server.js > /dev/null 2>&1 &
nohup
signifie: N'interrompez pas ce processus même lorsque le stty est coupé.> /dev/null
signifie: stdout va à / dev / null (qui est un périphérique factice qui n'enregistre aucune sortie).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
&
à la fin signifie: exécutez cette commande en tâche de fond.la source
/dev/null
? Belle journalisation ... Bonne chance pour essayer de déboguer ceci ...Vous devriez vraiment essayer d'utiliser
screen
. C'est un peu plus compliqué que de le fairenohup long_running &
, mais comprendre l'écran une fois qu'on ne revient plus.Commencez votre session d'écran au début:
Exécutez tout ce que vous voulez:
Appuyez sur ctrl + A, puis sur d. Terminé. Votre session se poursuit en arrière-plan.
Vous pouvez répertorier toutes les sessions par
screen -ls
et en attacher à certaines parscreen -r 20673.pts-0.srv
, où 0673.pts-0.srv est une liste d'entrées.la source
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 l'exécution d'un processus node.js dans une session d'écran, avec
&
ou même avec lenohup
drapeau - tous - sont juste des solutions de contournement.Surtout la solution screen / tmux, qui devrait vraiment être considérée comme une solution amateur . Screen et Tmux ne sont pas destinés à maintenir le fonctionnement des processus, mais à multiplexer des sessions de terminal. C'est très 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 attaché à une session de terminal. C'est trop fragile. Pour continuer à fonctionner, vous devez démonifier le processus!
Il existe de nombreux bons outils pour le faire.
PM2 : http://pm2.keymetrics.io/
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 rendre le processus persistant entre les redémarrages:
Où
platform
peut êtreubuntu|centos|redhat|gentoo|systemd|darwin|amazon
.forever.js : https://github.com/foreverjs/forever
Scripts d'initialisation :
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 dans ce sujet et ce serait trop long pour cette réponse, mais en gros, ce sont de simples scripts shell, déclenchés par des événements du système d'exploitation. Vous pouvez en savoir plus à ce sujet ici
Docker :
Exécutez simplement votre serveur dans un conteneur Docker avec
-d
option et, voilá , vous avez un serveur node.js démonisé!Voici un exemple de Dockerfile (du guide officiel de node.js ):
Créez ensuite votre image et exécutez votre conteneur:
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 au fil des heures!
la source
tail -f
ing le fichier journal généré par pm2.screen
solution que de nombreuses personnes trouvent que le travail est une solution de contournement. Il existe de nombreuses façons de réaliser une tâche spécifique. Je crois qu'il arrive que (considérez la question spécifique) il se trouve qu'il accomplit la tâche spécifique d'run as background and never die
exceller pour beaucoup. Il a également l'avantage supplémentaire de permettre à l'utilisateur d'y revenir pour ré-interagir et apporter des modifications s'il le souhaite. La clé est que les composants sontbackground
etnever die
. Toutes les solutions ont certains bonus.nohup
est la solution. Il est intégré à Linux et c'est pour cela qu'il est là. C'est une ligne, c'est propre et cela fonctionne comme prévu, à chaque fois, indépendamment des mises à jour. Les gens devraient vraiment essayer d'éviter d'utiliser des outils tiers pour des cas d'utilisation de base comme celui-ci. L'exemple de docker (par exemple) est beaucoup plus détaillé et gourmand en ressources que la seule commande simple dans la réponse la plus votée. J'adore Docker, mais pas pour ça.nohup
solution ne satisfait pas à l'exigence "ne jamais mourir". Sauf si vous écrivez unetrap
boucle infinie très délicate ou hacky, je ne vois pas comment garder le processus démonifié sans utiliser des outils spécialement écrits à cet effet (ou un script d'initialisation écrit par vous-même, bien sûr).une autre solution renie le travail
la source
nohup
permettra au programme de continuer même après la mort du terminal. J'ai en fait eu des situations oùnohup
empêche la session SSH de se terminer correctement, vous devez donc également rediriger l'entrée:Selon la
nohup
configuration, vous devrez peut-être également rediriger la sortie standard et l'erreur standard vers des fichiers.la source
J'ai cette fonction dans mon fichier shell rc, basée sur la réponse de @ Yoichi:
Vous pouvez l'utiliser de cette façon:
la source
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
pour 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.
la source
Il supprimera la commande de la liste des tâches actives et enverra la commande en arrière-plan
la source
Avez-vous lu sur la commande nohup ?
la source
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, probablement tout ce que vous avez à faire est de définir certaines variables. Votre script héritera de valeurs par défaut fines
/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 sontDAEMON
etNAME
. Le script utiliserastart-stop-daemon
pour exécuter votre commande,START_ARGS
vous pouvez définir des paramètres supplémentairesstart-stop-daemon
à utiliser.Voilà comment j'exécute des trucs en python pour mon wiki wikimedia:
Outre la définition de vars, j'ai dû remplacer à
do_stop_cmd
cause de python substitue l'exécutable, donc le service ne s'est pas arrêté correctement.la source
Outre les solutions intéressantes ci-dessus, je mentionnerais également les outils de supervision et de surveillance qui permettent de démarrer le processus, de surveiller sa présence et de le démarrer en cas de mort. Avec 'monit', vous pouvez également exécuter des vérifications actives comme vérifier si le processus répond à la demande http
la source
Pour Ubuntu, j'utilise ceci:
Cordialement
la source
Essayez ceci pour une solution simple
cmd et sortie
la source