Comment utiliser la commande nohup sous Linux

Comment utiliser la commande nohup sous Linux

La commande Linux nohuppermet aux processus importants de continuer à s’exécuter même si la fenêtre du terminal qui les a lancés est fermée. Nous allons vous montrer comment utiliser cette commande vénérable sur Linux moderne.

HUP et SIGHUP

Unix, l’ancêtre de Linux, a été créé avant l’invention du PC. Les ordinateurs étaient des pièces d’équipement volumineuses et coûteuses. Les gens interagissaient avec eux sur des lignes série, soit localement dans le même bâtiment, soit à distance via des connexions lentes par modem. Au départ, ils imprimaient leurs instructions sur des téléimprimeurs, qui furent progressivement remplacés par des terminaux émoussés.

Ils ont été appelés stupides parce que la puissance de traitement était dans l’ordinateur auquel vous étiez connecté, pas dans le terminal sur lequel vous tapiez. Les programmes s’exécutaient sur l’ordinateur, où qu’il se trouve, et non sur l’appareil de votre bureau.

Si quelque chose s’est produit et a rompu la connexion entre votre terminal et l’ordinateur, l’ordinateur a détecté un saut de ligne et a envoyé HUPou raccroché un signal aux programmes que vous exécutiez. Les programmes ont cessé de s’exécuter lorsqu’ils ont reçu un signal.

Cette fonctionnalité perdure sous Linux aujourd’hui. La fenêtre du terminal sur votre PC est une émulation d’un terminal physique. Si vous avez des processus en cours d’exécution qui ont été lancés à partir de cette fenêtre de terminal et que vous fermez cette fenêtre, un SIGHUPsignal est envoyé aux programmes afin qu’ils soient informés HUPet sachent qu’ils doivent quitter.

Il y a un effet cascade. Si les processus ont démarré des processus enfants, SIGHUP leur est également transmis afin qu’ils sachent qu’ils doivent se terminer.

La commande nohupdémarre les processus enfants, mais refuse de SIGHUPles signaler. Cela peut sembler être un problème, mais c’est en fait une fonctionnalité utile.

commande noup

Si vous voulez qu’un processus continue même si la fenêtre du terminal à partir de laquelle il a été lancé est fermée, vous avez besoin d’un moyen de le piéger SIGHUPafin que le programme ne l’obtienne jamais. (La fenêtre du terminal ne démarre pas réellement les processus, ils sont démarrés par une session shell à l’intérieur de la fenêtre du terminal.) Une solution simple et élégante à ce problème consiste à placer un autre processus entre la session shell et le programme, et à faire en sorte que le programme middleware ne SIGHUPsignale jamais.

C’est ce nohupqu’il fait. Il exécute des programmes pour que vous soyez des processus enfants nohup, et non des processus enfants shell. Puisqu’il ne s’agit pas de processus enfants du shell, ils ne recevront pas directement SIGHUPdu shell. Et s’il nohupne le transmet pas SIGHUPà ses enfants, le programme ne le recevra pas du tout SIGHUP.

Ceci est utile lorsque, par exemple, vous avez un long processus qui doit s’exécuter avant la fin. Si vous fermez accidentellement la fenêtre du terminal et son shell, vous mettrez également fin au processus. Utiliser nohuppour démarrer un processus isole le processus du nohupsignal. Si vous travaillez à distance sur un ordinateur via SSH et que vous ne souhaitez pas qu’un processus important se termine si la connexion à distance échoue, vous devez démarrer le processus sur l’ordinateur distant avec l’extension nohup.

Utiliser nohup

Nous avons créé un programme qui ne fait rien d’utile, mais il s’exécute et s’exécute jusqu’à ce qu’il soit terminé. Il imprime l’heure dans la fenêtre du terminal toutes les trois secondes. C’est ce qu’on appelle long-procle « long processus ».

./long-proc

S’il s’agissait d’un programme qui fait quelque chose d’utile et que nous voudrions qu’il continue à s’exécuter même si la fenêtre du terminal et le shell sont fermés, nous l’exécuterions avec un nohup.

nohup. /long-proc

Le processus en est séparé stdin, stdout il ne peut donc ni recevoir de données ni écrire dans la fenêtre du terminal. De plus, comme il est toujours en cours d’exécution, vous ne serez pas renvoyé à l’invite de commande. Tout ce qui nohupdoit être fait est de rendre le processus insensible à la fermeture du terminal. Cela ne transforme pas le processus en une tâche d’arrière-plan.

Avez-vous maintenant besoin de redémarrer pour terminer le processus ? Non. Pour arrêter nohupun processus que vous n’avez pas lancé en arrière-plan, appuyez sur la combinaison de touches Ctrl+C.

La sortie du programme a été écrite pour nous dans un fichier appelé « nohup.out ». On peut le voir à moindre coût.

less nohup.out

Tout ce qui est normalement envoyé à une fenêtre de terminal est capturé dans un fichier. Les nohupexécutions suivantes seront ajoutées au fichier « nohup.out » existant.

Un moyen plus utile de démarrer un processus consiste à le démarrer de nohupmanière à ce qu’il puisse supporter la fermeture de la fenêtre du terminal, tout en en faisant une tâche en arrière-plan. Pour ce faire, nous ajoutons une esperluette  » & » à la fin de la ligne de commande.

nohup. /long-proc &

Vous devrez appuyer à nouveau sur « Entrée » pour revenir à la ligne de commande. On nous dit que le numéro de tâche de processus est 1 (le nombre entre parenthèses  » []« ) et que l’ID de processus est 13115.

Nous pouvons utiliser n’importe lequel d’entre eux pour terminer le processus. « Ctrl + C » ne fonctionne pas maintenant car le programme n’a aucune connexion ni avec la fenêtre du terminal ni avec le shell.

Si vous avez oublié le numéro de travail, vous pouvez utiliser jobsla commande pour répertorier les tâches d’arrière-plan exécutées à partir de cette fenêtre de terminal.

jobs

Pour tuer notre tâche, nous pouvons utiliser killla commande et le numéro de tâche précédés d’un signe de pourcentage  » %« , comme ceci :

kill %1

Si vous avez fermé la fenêtre du terminal, vous devez trouver l’identifiant du processus et l’utiliser avec killla commande. La commande pgreptrouvera l’ID de processus pour les processus qui correspondent à la clé de recherche que vous avez entrée. Nous allons rechercher le nom du processus.

pgrep long-proc

Nous pouvons maintenant utiliser l’ID de processus pour terminer le processus.

kill 13115

La prochaine fois que vous appuierez sur « Entrée », vous serez informé que le processus est terminé.

Voyons maintenant ce qui ne met pas fin au processus. Nous allons le redémarrer puis fermer la fenêtre du terminal.

nohup. /long-proc

Si nous ouvrons une nouvelle fenêtre de terminal et trouvons notre processus avec pgrep, nous pouvons voir qu’il est toujours en cours d’exécution. La fermeture de la fenêtre du terminal qui a lancé le processus n’a eu aucun effet.

pgrep long-proc

Vous pouvez transmettre plusieurs commandes à nohup, mais il est généralement préférable de les exécuter individuellement. Cela facilite leur manipulation en tant que travaux d’arrière-plan. Les commandes ne seront pas exécutées en même temps, elles seront exécutées les unes après les autres. L’exécution n’est pas parallèle, elle est séquentielle. Pour qu’ils fonctionnent en même temps, vous devez les exécuter séparément.

Cela dit, pour exécuter plusieurs processus en même temps, utilisez nohupun shell Bash pour démarrer et utilisez l’ -coption (commandes) avec la ligne de commande. Utilisez des guillemets simples  » ' » pour délimiter la liste des commandes et des doubles esperluettes  » && » pour séparer les commandes.

nohup bash -c 'ls /bin && ls /sbin'

Si vous lessaffichez le fichier « nohup.out », vous verrez la sortie du premier processus, puis la sortie du second processus.

less nohup.out

La sortie des deux commandes a été capturée dans le fichier « nohup.out ». Ce n’est pas lié, la sortie du deuxième processus ne démarre qu’après la fin du premier processus.

Si vous souhaitez utiliser votre propre fichier au lieu de « nohup.out », vous pouvez rediriger la commande vers un fichier de votre choix.

nohup bash -c 'ls /bin && ls /sbin' > myfile.txt

Notez que le message ne dit plus « ajout de sortie à nohupo.out » mais plutôt « redirection de stderr vers stdout » et nous redirigeons stdout vers notre fichier « myfile.txt ».

Nous pouvons regarder à l’intérieur du fichier « myfile.txt » avec moins d’effort.

less myfile.txt

Comme précédemment, il contient la sortie des deux commandes.

C’est drôle comme l’histoire de l’utilitaire peut parfois donner l’impression qu’elle n’est pas pertinente pour le présent. L’équipe en nohupfait partie. Quelque chose qui a été créé pour gérer les ruptures de ligne série est toujours utile aux utilisateurs Linux d’aujourd’hui sur des machines incroyablement puissantes.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *