Comment utiliser la commande nohup sous Linux

Publié: 2022-06-25
Ordinateur portable Linux affichant une invite bash
fatmawati achmad zaenuri/Shutterstock.com

La commande Linux nohup permet aux processus importants de continuer à s'exécuter même lorsque la fenêtre du terminal qui les a lancés est fermée. Nous vous montrons comment utiliser cette commande vénérable sur Linux d'aujourd'hui.

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. A l'origine, ils tapaient leurs instructions sur des téléimprimeurs qui furent progressivement remplacés par des terminaux muets.

Ils étaient qualifiés de stupides parce que la puissance de traitement se trouvait dans l'ordinateur auquel vous étiez connecté, et non dans le terminal sur lequel vous tapiez. Les programmes s'exécutaient sur l'ordinateur, où qu'il soit, 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é la perte de ligne et a envoyé un HUP ou un signal de raccrochage aux programmes que vous exécutiez. Les programmes ont cessé de s'exécuter lorsqu'ils ont reçu le signal.

Comment tuer une application de bureau ou un processus d'arrière-plan sous Linux
CONNEXION Comment tuer une application de bureau ou un processus d'arrière-plan sous Linux

Cette fonctionnalité perdure dans Linux aujourd'hui. Sur votre PC, une fenêtre de terminal 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, le signal SIGHUP est envoyé aux programmes afin qu'ils soient informés du HUP et sachent qu'ils doivent se terminer.

Il y a un effet de cascade qui se produit. Si les processus ont lancé des processus enfants, le SIGHUP leur est également transmis afin qu'ils sachent qu'ils doivent se terminer.

La commande nohup lance les processus enfants mais refuse de leur transmettre les signaux SIGHUP . Cela peut sembler être un problème, mais c'est en fait une fonction utile.

La commande nohup

Si vous souhaitez 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 d'intercepter le SIGHUP afin que le programme ne le reçoive jamais. (En fait, la fenêtre du terminal ne lance pas de processus, ils sont lancés par la session shell à l'intérieur de la fenêtre du terminal.) La solution simple et élégante à ce problème est de placer un autre processus entre la session shell et le programme, et que programme de couche intermédiaire ne transmet jamais le signal SIGHUP .

C'est ce que fait nohup . Il lance des programmes pour vous afin qu'ils soient un processus enfant de nohup , et non un processus enfant du shell. Parce qu'ils ne sont pas un processus enfant du shell, ils ne recevront pas directement un SIGHUP du shell. Et si nohup ne transmet pas SIGHUP à ses enfants, le programme ne recevra pas SIGHUP du tout.

Ceci est utile lorsque, par exemple, vous avez un processus de longue durée que vous devez laisser s'exécuter jusqu'à la fin. Si vous fermez accidentellement la fenêtre du terminal et son shell, vous terminerez également le processus. L'utilisation de nohup pour lancer le processus isole le processus du signal nohup . Si vous travaillez à distance sur un ordinateur via SSH et que vous ne souhaitez pas qu'un processus sensible se termine si la connexion à distance échoue, vous devez démarrer le processus sur l'ordinateur distant avec nohup .

Utiliser nohup

Nous avons créé un programme qui ne fait rien d'utile, mais il s'exécutera et s'exécutera 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-proc pour "long processus".

 ./long-proc 

Le programme long-proc exécutant une fenêtre de terminal

S'il s'agissait d'un programme qui faisait quelque chose d'utile et que nous voulions qu'il continue à fonctionner même si la fenêtre du terminal et le shell sont fermés, nous le lancerions avec nohup .

 nohup ./long-proc 

lancement du programme long-proc de nohup

Le processus est découplé de stdin et stdout afin qu'il ne puisse ni recevoir d'entrée ni écrire dans la fenêtre du terminal. De plus, comme il est toujours en cours d'exécution, vous n'êtes pas renvoyé à l'invite de commande. Tout ce que nohup fait, c'est rendre le processus insensible à la fermeture du terminal. Cela ne transforme pas le processus en tâche de fond.

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

Arrêter le processus long-proc avec Ctrl+C

La sortie du programme a été capturée pour nous dans un fichier appelé "nohup.out". On peut le revoir avec moins.

 moins nohup.out 

Ouvrir le fichier nohup.out en moins

Tout ce qui serait généralement envoyé à la fenêtre du terminal est capturé dans le fichier. Les exécutions ultérieures de nohup seront ajoutées au fichier "nohup.out" existant.

La sortie de long-proc écrite dans le fichier nohup.out, affichée en moins

Un moyen plus utile d'exécuter le processus consiste à le lancer avec nohup afin qu'il résiste à la fermeture de la fenêtre du terminal et à en faire une tâche en arrière-plan en même temps. Pour ce faire, nous ajoutons une esperluette " & " à la fin de la ligne de commande.

 nohup ./long-proc & 

lancer le programme long-proc avec nohup et en faire une tâche en arrière-plan

Vous devrez appuyer sur "Entrée" une fois de plus pour revenir à l'invite de commande. On nous dit que le numéro de travail du processus est 1—le nombre entre parenthèses " [] "— et que l'ID de processus est 13115.

Nous pouvons utiliser l'un ou l'autre pour terminer le processus. "Ctrl + C" ne fonctionnera pas maintenant car le programme n'a aucune association avec la fenêtre du terminal ou le shell.

Si vous oubliez le numéro de tâche, vous pouvez utiliser la commande jobs pour répertorier les tâches d'arrière-plan qui ont été lancées à partir de cette fenêtre de terminal.

 travaux 

Liste des tâches d'arrière-plan qui ont été lancées à partir d'une fenêtre de terminal

Pour tuer notre tâche, nous pouvons utiliser la commande kill et le numéro de travail, précédé d'un signe de pourcentage " % ", comme ceci :

 tuer %1

Si vous avez fermé la fenêtre du terminal, vous devrez trouver l'ID de processus et l'utiliser avec la commande kill . La commande pgrep trouvera l'ID de processus pour les processus qui correspondent à l'indice de recherche que vous fournissez. Nous allons rechercher le nom du processus.

 pgrep long-proc 

Recherche de l'ID de processus d'un processus par son nom

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

 tuer 13115 

Utilisation de la commande kill et de l'ID de processus pour terminer un processus

La prochaine fois que vous appuyez sur "Entrée", vous êtes informé que le processus est terminé.

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

 nohup ./long-proc 

Fermeture de la fenêtre du terminal avec un processus en cours d'exécution

Si nous ouvrons une nouvelle fenêtre de terminal et recherchons notre processus avec pgrep , nous voyons 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 

Utiliser pgrep pour rechercher un processus par son nom

Il est possible de passer plusieurs commandes à nohup , mais il est généralement préférable de les lancer séparément. Cela facilite leur manipulation en tant que tâches d'arrière-plan. Les commandes ne s'exécuteront pas en même temps, elles seront exécutées les unes après les autres. L'exécution n'est pas concurrente, elle est séquentielle. Pour les exécuter simultanément, vous devez les lancer séparément.

Cela dit, pour lancer plusieurs processus à la fois, utilisez nohup pour lancer un shell Bash et utilisez l'option -c (commandes) avec la chaîne de commandes. Utilisez des guillemets simples « ' » pour envelopper la liste de commandes et des doubles esperluettes « && » pour séparer les commandes.

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

Lancer deux processus avec nohup

Si vous utilisez less pour parcourir le fichier "nohup.out", vous verrez la sortie du premier processus, puis la sortie du second processus.

 moins nohup.out 

Ouvrir le fichier nohup.out en moins

La sortie des deux commandes a été capturée dans le fichier "nohup.out". Il n'est pas entrelacé, la sortie du deuxième processus ne démarre qu'une fois le premier processus terminé.

Le contenu du fichier nohup.out en moins

Si vous souhaitez utiliser un fichier qui vous est propre au lieu de "nohup.out", vous pouvez rediriger la commande dans le fichier de votre choix.

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

rediriger la sortie des processus vers un fichier fourni par l'utilisateur

Notez que le message ne dit plus "ajouter la sortie à nohupo.out", il dit "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 less.

 moins monfichier.txt 

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


C'est drôle comme l'histoire d'un service public peut parfois donner l'impression qu'il n'a aucun rapport avec les temps modernes. La commande nohup en fait partie. Quelque chose qui a été créé pour faire face aux déconnexions sur les lignes série est toujours utile aux utilisateurs Linux d'aujourd'hui sur des machines incroyablement puissantes.

CONNEXION: 37 commandes Linux importantes que vous devez connaître