web-dev-qa-db-fra.com

Garder un processus en cours d'exécution après la fermeture de PuTTY ou du terminal

J'exécute un serveur Node.js à partir d'une machine Raspbian (Debian), et j'aimerais démarrer et arrêter le serveur à distance. Pour moi, cela signifie utiliser PuTTY pour accéder au shell, sauf lorsque je ferme le terminal PuTTY ou qu'il expire, mon serveur tombe en panne, car j'exécute mon serveur au premier plan.

Existe-t-il un moyen de continuer, mais avez-vous toujours un moyen de tuer le processus par la suite?

65
Spencer

Votre question manquait un peu de détails, donc je suppose que vous voulez dire que vous avez tapé la commande pour démarrer votre serveur sur la console de votre Pi, et qu'elle a été exécutée au premier plan.

Si tel est le cas, vous avez cinq options, classées par complexité à mettre en œuvre:

  1. Utilisez réponse de @ f-tussel . Puisque vous êtes nouveau sur GNU/Linux, le symbole & Indique au shell qu'il doit exécuter le processus en arrière-plan et vous renvoyer immédiatement à l'invite, au lieu de ce qu'il fait normalement (qui est d'attendre la pour terminer avant de revenir à l'invite). C'est ce qu'on appelle techniquement la mise en arrière-plan de la commande.

  2. Faites ce que vous avez fait auparavant, mais faites-le dans un processus screen. Fondamentalement, cela implique d'installer screen (Sudo apt-get install screen Sur votre système Debian), puis quelque temps avant de taper la commande pour démarrer votre serveur, vous exécutez screen. Cela ouvre un nouveau Shell auquel vous pouvez vous reconnecter plus tard, même si votre connexion PuTTY s'éteint. Il agira donc comme si vous ne vous étiez jamais déconnecté.

    Si vous n'êtes pas familier avec screen, vous voudrez peut-être faire quelques lectures sur Wikipedia et dans les pages de manuel . Vous pouvez également accomplir la même chose avec tmux.

  3. Utilisez le module forever node.js. Voir https://stackoverflow.com/questions/4797050/how-to-run-process-as-background-and-never-die pour savoir où je l'ai obtenu.

  4. Mettez votre serveur dans un processus screen en arrière-plan. Cela signifie que vous allez créer une nouvelle session screen en arrière-plan mais ne vous y attachez jamais. Et, au lieu d'exécuter un shell, le processus d'écran exécutera votre serveur. Voici ce que vous allez taper:

    screen -d -m exec_your_server --put-args-here
    

    Si vous le souhaitez, vous pouvez effectuer cette exécution au démarrage. Fondamentalement, vous devez mettre la commande d'écran dans le fichier /etc/rc.local Ou /etc/rc.d/rc.local, J'oublie lequel. Si vous rencontrez des difficultés à le faire, posez une nouvelle question.

    Encore une fois, vous pouvez aussi le faire avec tmux.

  5. Écrivez un script de service. Puisque vous êtes sur Debian et que vous êtes nouveau, vous utilisez probablement le init par défaut que Debian fournit, qui est System V Init. Je n'ai jamais regardé les fichiers de service pour System V Init, seulement systemd et un peu Upstart, donc je ne peux pas vous aider ici. Posez une nouvelle question si vous souhaitez poursuivre.

    C'est le moyen le moins "hacky", à mon humble avis, et c'est ce que vous devriez envisager de faire si vous exécutez votre serveur à long terme, car vous pouvez ensuite le gérer comme d'autres services sur le système via des commandes comme Sudo service your_server stop, etc. Le faire de cette façon démarrera automatiquement votre serveur au démarrage, et vous n'avez pas besoin de screen car cela se produit également automatiquement en arrière-plan.

    Il s'exécute également automatiquement en tant que root, ce qui est dangereux - vous devez mettre de la logique dans votre serveur pour supprimer les privilèges dont vous disposez en devenant un utilisateur non privilégié que vous avez créé spécifiquement pour le serveur. (C'est au cas où le serveur serait compromis - imaginez si quelqu'un pourrait exécuter les choses en tant que root, via votre serveur! Eugh. Cette question fait un bon travail de parler de cela.)

48
strugee

Je ne connais pas raspbian, mais comme il est dérivé de Debian, je suppose que Nohup sera également disponible. Au lieu d'exécuter un processus en tant que,

$  proc &

essayez d'utiliser:

$ Nohup proc &

Le Nohup empêchera le processus de se terminer lorsque le terminal se déconnecte. HTH.

49
F. Tusell

Utilisez supervisord si vous êtes vraiment sérieux.

Méthode de base pour exécuter votre binaire en tant que:

$ Nohup node app &
$ echo $! > node-instance.pid

Ensuite, quand vous voulez le tuer,

$ kill `cat node-instance.pid`

Mais j'utiliserais supervisord. Cela vous permet de faire beaucoup de choses fantaisistes.

6
onur güngör

Si vous exécutez bash un Shell, vous pouvez également utiliser la commande disown qui aura le même résultat que la commande Nohup sauf qu'elle prend le premier programme en cours d'exécution qu'elle trouve. Par exemple :

$ command &
$ disown

Ou peut-être pouvez-vous créer un script qui accélère votre processus et tue le père afin que l'enfant soit hérité par init. C'est ce que je fais pour les scripts par exemple. Ce n'est pas plus simple, mais lorsque vous le lancez, il passe automatiquement en arrière-plan et ne s'arrête pas si vous vous déconnectez.

Une autre solution serait de créer un fichier de service et de l'activer pour pouvoir démarrer, arrêter, redémarrer ou quoi que ce soit avec une simple commande. (mais je ne sais pas vraiment si debian utilise systemd puisque je suis sur archlinux)

5
Depado