Comment utiliser la commande nohup sous Linux
La commande Linux nohup
permet 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é HUP
ou 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 SIGHUP
signal est envoyé aux programmes afin qu’ils soient informés HUP
et 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 nohup
démarre les processus enfants, mais refuse de SIGHUP
les 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 SIGHUP
afin 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 SIGHUP
signale jamais.
C’est ce nohup
qu’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 SIGHUP
du shell. Et s’il nohup
ne 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 nohup
pour démarrer un processus isole le processus du nohup
signal. 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-proc
le « 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 nohup
doit ê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 nohup
un 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 nohup
exécutions suivantes seront ajoutées au fichier « nohup.out » existant.
Un moyen plus utile de démarrer un processus consiste à le démarrer de nohup
maniè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 jobs
la 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 kill
la 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 kill
la commande. La commande pgrep
trouvera 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 nohup
un shell Bash pour démarrer et utilisez l’ -c
option (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 less
affichez 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 nohup
fait 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