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

HUP et SIGHUP

Unix, l’ancêtre de Linux, a été créé avant que le PC ne soit inventé. Les ordinateurs étaient des équipements volumineux et coûteux. Les gens interagissaient avec eux via des lignes série, soit localement dans le même bâtiment, soit à distance via de lentes connexions par modem. À l’origine, ils tapaient leurs instructions sur des téléimprimeurs qui ont été progressivement remplacés par des terminaux muets.

On les appelait ainsi 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 étaient exécutés sur l’ordinateur, où qu’il se trouve, et non sur le dispositif posé sur votre bureau.

Si quelque chose se produisait et rompait la connexion entre votre terminal et l’ordinateur, ce dernier détectait la coupure de la ligne et envoyait un signal HUP (raccrochage) aux programmes que vous exécutiez. Les programmes cessaient de s’exécuter lorsqu’ils recevaient le signal.

Cette fonctionnalité est toujours présente 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 depuis 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 signal SIGHUP leur est également transmis afin qu’ils sachent qu’ils doivent se terminer.

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

COMMENT UTILISER LA COMMANDE SCP SOUS LINUX

La commande nohup

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 devez trouver un moyen d’intercepter le signal SIGHUP afin que le programme ne le reçoive jamais. (En fait, la fenêtre du terminal ne lance pas les processus, ils sont lancés par la session du 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 de faire en sorte que ce programme de couche intermédiaire ne transmette jamais le signal SIGHUP.

C’est ce que fait nohup. Il lance les programmes pour vous de sorte 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 le SIGHUP à ses enfants, le programme ne recevra pas de SIGHUP du tout.

Ceci est utile lorsque, par exemple, vous avez un processus qui s’exécute depuis longtemps et que vous devez laisser se terminer. Si vous fermez accidentellement la fenêtre du terminal et son shell, vous mettrez fin au processus également. 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 voulez pas qu’un processus sensible soit interrompu si la connexion à distance échoue, vous démarrez le processus sur l’ordinateur distant avec nohup .

COMMENT UTILISER LA COMMANDE SAR SOUS LINUX

Utilisation de nohup

Nous avons créé un programme qui ne fait rien d’utile, mais qui s’exécute jusqu’à ce qu’il soit arrêté. Il affiche l’heure dans la fenêtre du terminal toutes les trois secondes. Il s’appelle long-proc pour « long processus ».

./long-proc

Le programme long-proc s’exécutant dans 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 à s’exécuter 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 depuis nohup

Le processus est découplé de stdin et stdout, il ne peut donc 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 est de rendre le processus imperméable à la fermeture du terminal. Il ne transforme pas le processus en tâche de fond.

Devez-vous maintenant redémarrer pour mettre fin au processus ? Non. Pour arrêter un processus nohup que vous n’avez pas lancé en tant que processus d’arrière-plan, tapez la combinaison de touches Ctrl+C.

Arrêt du processus long-proc avec Ctrl+C

La sortie du programme a été capturée pour nous dans un fichier appelé « nohup.out ». Nous pouvons l’examiner avec less.

less nohup.out

Ouvrir le fichier nohup.out avec less

Tout ce qui serait normalement 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.

Une façon plus utile d’exécuter le processus est de le lancer avec nohup pour qu’il résiste à la fermeture de la fenêtre du terminal, et d’en faire une tâche de fond 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 de fond

Vous devrez appuyer sur « Entrée » une fois de plus pour revenir à l’invite de commande. On nous dit que le numéro de tâche du processus est 1 – le nombre entre parenthèses « [] »- et que l’ID du processus est 13115.

Nous pouvons utiliser l’un ou l’autre pour mettre fin au processus. « Ctrl+C » ne fonctionnera pas maintenant car le programme n’est associé ni à la fenêtre du terminal ni au shell.

Si vous oubliez le numéro du travail, vous pouvez utiliser la commande jobs pour lister les tâches d’arrière-plan qui ont été lancées depuis cette fenêtre de terminal.

jobs

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 tâche, précédé du signe de pourcentage « % », comme ceci :

kill %1

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

pgrep long-proc

Trouver l’ID d’un processus par son nom

Maintenant nous pouvons utiliser l’ID du processus pour terminer le processus.

kill 13115

Utilisation de la commande kill et de l’ID du processus pour mettre fin à un processus

La prochaine fois que vous appuyez sur « Entrée », vous serez informé que le processus a été arrêté.

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 de terminal qui a lancé le processus n’a eu aucun effet.

pgrep long-proc

Utilisation de 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 permet de les manipuler plus facilement en tant que tâches d’arrière-plan. Les commandes ne seront pas exécutées en même temps, elles seront exécutées l’une après l’autre. L’exécution n’est pas simultanée, elle est séquentielle. Pour qu’elles s’exécutent en même temps, vous devez les lancer séparément.

Cela dit, pour lancer plusieurs processus en même temps, utilisez nohup pour lancer un shell Bash et utilisez l’option -c (commands) 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 ».

Lancement de deux processus avec nohup

Si vous utilisez less pour consulter le fichier « nohup.out », vous verrez la sortie du premier processus, puis la sortie du second processus.

less nohup.out

Ouverture du fichier nohup.out dans less

La sortie des deux commandes a été capturée dans le fichier « nohup.out ». Il n’est pas entrelacé, la sortie du second processus ne commence qu’une fois le premier processus terminé.

Le contenu du fichier nohup.out dans less

Si vous souhaitez utiliser un fichier de votre choix à la place de « nohup.out », vous pouvez rediriger la commande vers 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 « appending output to nohupo.out », il dit « redirecting stderr to stdout » et nous redirigeons stdout vers notre fichier « myfile.txt ».

Nous pouvons regarder à l’intérieur du fichier « monfichier.txt » avec less.

less monfichier.txt

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

Il est amusant de constater que l’histoire d’un utilitaire peut parfois donner l’impression qu’il n’a aucune pertinence pour les temps modernes. La commande nohup est l’une d’entre elles. Quelque chose qui a été créé pour faire face aux déconnexions sur les lignes série est toujours utile aux utilisateurs actuels de Linux sur des machines incroyablement puissantes.