Comment utiliser la commande Nohup sous Linux

By Corentin BURTIN

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 .

A lire également :   Nouveautés de Fedora 37, disponibles dès maintenant

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.

Comment créer un alias sous Linux

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.

A lire également :   Installer Fail2ban sur le serveur Ubuntu 18.04

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.

Comment lire les données d’un socket en Bash sous Linux ?

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é.

Comment lister les utilisateurs sous Linux

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.

Qu’est-ce que Nohup dans Unix avec un exemple ?

Nohup est une commande Unix qui permet d’exécuter des commandes ou des scripts shell en arrière-plan (en tâche de fond) et de les détacher du terminal, ce qui signifie que même si l’utilisateur ferme le terminal ou se déconnecte de la session, le processus continuera à s’exécuter.

La syntaxe de la commande nohup est la suivante :

codenohup commande [arguments]

Par exemple, si vous souhaitez exécuter un script shell nommé « mon_script.sh » en arrière-plan et détacher le processus du terminal, vous pouvez utiliser la commande nohup de la manière suivante :

codenohup ./mon_script.sh &

Le caractère « & » à la fin de la commande permet de lancer le processus en arrière-plan. Lorsque la commande est exécutée, le résultat est écrit dans un fichier « nohup.out » situé dans le répertoire où la commande a été exécutée. Vous pouvez également spécifier un autre nom de fichier pour stocker la sortie en utilisant l’option « -o » de nohup :

codenohup ./mon_script.sh -arg1 -arg2 -arg3 -o sortie.txt &

Cela lancera le script avec les arguments « -arg1 -arg2 -arg3 » en arrière-plan et stockera la sortie dans un fichier nommé « sortie.txt ».

A lire également :   Les meilleurs ordinateurs portables Linux de 2023

Comment exécuter une commande Nohup ?

Pour exécuter une commande en utilisant nohup, vous pouvez suivre ces étapes simples :

  1. Ouvrez votre terminal Unix ou votre interface de ligne de commande.
  2. Tapez la commande que vous souhaitez exécuter, suivie de « & » pour la lancer en arrière-plan. Par exemple :

codema_commande &

  1. Ajoutez « nohup » avant la commande pour la lancer avec nohup et détacher le processus du terminal. Par exemple :

codenohup ma_commande &

  1. Appuyez sur la touche « Entrée » pour lancer la commande.
  2. La sortie de la commande sera redirigée vers un fichier « nohup.out » situé dans le répertoire où la commande a été exécutée. Vous pouvez également spécifier un autre nom de fichier pour stocker la sortie en utilisant l’option « -o » de nohup.
  3. Vous pouvez fermer le terminal ou vous déconnecter de la session sans interrompre la commande en arrière-plan. Le processus continuera à s’exécuter jusqu’à son terme.

Il est important de noter que l’utilisation de nohup peut être utile pour exécuter des commandes longues ou pour empêcher les commandes d’être interrompues par une déconnexion imprévue ou un arrêt du terminal, mais il est également important de surveiller l’utilisation des ressources système pour éviter tout impact sur les performances.

Comment exécuter un script Shell avec Nohup ?

Pour exécuter un script shell avec nohup, vous pouvez suivre ces étapes simples :

  1. Ouvrez votre terminal Unix ou votre interface de ligne de commande.
  2. Tapez la commande suivante en remplaçant « mon_script.sh » par le nom de votre script shell :
codenohup ./mon_script.sh &
  1. Appuyez sur la touche « Entrée » pour lancer le script shell avec nohup et le détacher du terminal.
  2. La sortie du script shell sera redirigée vers un fichier « nohup.out » situé dans le répertoire où la commande a été exécutée. Vous pouvez également spécifier un autre nom de fichier pour stocker la sortie en utilisant l’option « -o » de nohup :
codenohup ./mon_script.sh -arg1 -arg2 -arg3 -o sortie.txt &

Cela lancera le script shell avec les arguments « -arg1 -arg2 -arg3 » en arrière-plan et stockera la sortie dans un fichier nommé « sortie.txt ».

  1. Vous pouvez fermer le terminal ou vous déconnecter de la session sans interrompre l’exécution du script shell en arrière-plan. Le processus continuera à s’exécuter jusqu’à son terme.

Il est important de noter que l’utilisation de nohup peut être utile pour exécuter des scripts shell longs ou pour empêcher les scripts d’être interrompus par une déconnexion imprévue ou un arrêt du terminal, mais il est également important de surveiller l’utilisation des ressources système pour éviter tout impact sur les performances.

Comment créer un fichier Nohup sous Linux ?


La commande nohup dans Linux crée automatiquement un fichier de sortie nommé « nohup.out » dans le répertoire où vous exécutez la commande. Si vous souhaitez spécifier un nom de fichier de sortie différent, vous pouvez utiliser l’option « -o » suivi du nom du fichier de sortie que vous souhaitez créer. Par exemple, pour créer un fichier de sortie nommé « mon_fichier_de_sortie.txt », vous pouvez exécuter la commande suivante :

codenohup ma_commande -option1 -option2 -option3 -o mon_fichier_de_sortie.txt &

Cette commande exécutera « ma_commande » avec les options « -option1 », « -option2 » et « -option3 », et écrira la sortie de la commande dans le fichier « mon_fichier_de_sortie.txt » plutôt que dans le fichier « nohup.out » par défaut.

Si le fichier de sortie n’existe pas, nohup créera automatiquement le fichier pour vous. Si le fichier existe déjà, nohup ajoutera la sortie de la commande à la fin du fichier. Si vous souhaitez écraser le contenu du fichier à chaque exécution, vous pouvez utiliser l’option « -c » avec nohup :

codenohup ma_commande -option1 -option2 -option3 -o mon_fichier_de_sortie.txt -c &

Cette commande écrasera le contenu du fichier « mon_fichier_de_sortie.txt » à chaque exécution de la commande.

Laisser un commentaire