Utilisation de la commande nohup
Nohup est une commande qui permet de lancer un processus qui restera actif même après la déconnexion de l'utilisateur.
Cette dernière peut s'avérer très utile si on la combine au '&' qui permet de lancer un processus en arrière plan.
Prenons un exemple concret : je souhaite effectuer une action sur un serveur distant en ssh, mais je n'ai pas envie d'attendre la fin de la commande pour pouvoir me déconnecter.
Ici, je lance le téléchargement d'un gros fichier :
# ssh pti-seb@monserveur
# nohup wget ftp://...../Fedora-8-i386-rescuecd.iso &
# exit
A chaque utilisation, la commande crée un fichier de log nommé nohup.out, permettant de consulter les messages qui auraient dû s'afficher sur la console. On pourra visionner le contenu comme ceci :
# more nohup.out
Nohup permet donc en quelque sorte, de détacher complètement un processus de son utilisateur.
13 Commentaires pour "Utilisation de la commande nohup"
Flux des commentaires de cet article Ajouter un commentaireBonjour,
Il me semble que nohup crée lui-même un fichier nohup.out avec tous les logs.
Ne suffit-il pas?
Sinon très bonne idée cet article, nohup fonctionne avec presque toutes les commandes, très très pratique !
Autre commande sympatique, il y a screen qui permet beaucoup plus.
La différence entre les deux, nohup ne maintient pas d'entrée standard à la déconnexion, screen le fait. Donc si vous n'en avez pas besoin (ie un processus serveur), nohup est parfait.
@atchoum : j'avais même pas remarqué qu'il y avait un fichier nohup.out. Je vais modifier l'article.
@PatLeNain : tu as raison, screen est un peu plus complet mais aussi un peu plus compliiqué à utiliser, nohup à l'avantage d'être simple et rapide.
Autre petite astuce liée : la commande "disown". En fait, c'est bash qui termine une application quand on ferme un terminal ou qu'on quitte une session puisque tous les processus qu'on lance sont des processus fils de bash.
La commande disown indique à bash de se "déposséder" du processus et de le redonner à init (le processus "1"). Ainsi, par la suite quand on quitte bash, le processus reste en arrière plan.
nohup est différent dans le fonctionnement car il indique que le signal "TERM" de fermeture de l'application ne sera pas reçu par l'application mais intercepté par "nohup". C'est justement ce signal que bash envoie quand la session est fermée.
Je considère donc que "disown" est plus doux que "nohup" car bash est au courant qu'il est dépossédé d'un processus et en plus, la sortie standard n'est pas supprimée du terminal : on continue à voir les messsages de l'application.
Pour l'utiliser :
$ macommande &
$ disown %1
où 1 représente le premier job "dépossédé" : on peut en déposséder plusieurs comme cela (il faut alors taper le chiffre entre crochets renvoyé par bash : les numéros se suivent. Pour avoir la liste, taper "jobs").
@yoho : merci pour ce complément d'informations, je ne connaisais pas disown, d'ailleurs j'ai l'impression qu'on en parle jamais, car la commande nohup, je l'avais déjà vu dans pas mal d'article avant de l'essayer.
En revanche j'ai remarqué un truc assez génant, si veux utiliser disown avec l'exemple que j'ai donné, cela est impossible, car quand je lance el wget avec le '&', il ne me rend pas vraiment la main. Et il affiche en permanence des informations dans la console...
la commande est très utile, mais en l'occurence pour l'exemple de wget, l'option -b suffit:
wget -b url
il produit un fichier wget-log (puis wget-log.x s'il en existe déjà un) pour la progression.
@Tuxe : je ne connaissais pas cette option, j'ai surtout pris wget pour avoir un exemple concret, personnelement je m'en sert pour d'autres tâches, comme faire des backups en tar.gz ...
Argh ! j'avais écrit un commentaire long et paf : "Access denied"
Plus rien dans le cache de firefox
Bon, en gros je disais que la sortie standard n'est effectivement pas détachée, c'est ce que j'ai essayé d'expliquer. Ça a des avantages et des inconvénients.
Sinon, exemple concret : j'ouvre un terminal et je tapes "konqueror". Pour rattraper la main, je tapes Ctrl+Z et bg, mais konqueror reste "attaché" à la console : si je quitte le terminal, konqueror se ferme aussi. C'est là que "disown %1" intervient : les deux applis sont désormais indépendantes.
Screen n'est pas beaucoup plus complexe à utiliser. Son principal intérêt réside dans la facilité avec laquelle on accroche et décroche un processus du terminal.
Imaginons rapidement le cas ou l'on lance un processus, que l'on décroche, ce processus fonctionne en tache de fond, je veux revenir voir ou il en est et pourquoi pas à distance, avec screen je peu facilement le ré-accroché à mon terminal.
Je ne pense pas que cela soit possible avec nohup par exemple ou encore disown.
@yoho : opera est meilleur dans ce genre de situations, tu retrouve ton texte en revenant en arrière.
Merci pour cet article ! Même 4 ans plus tard, il est toujours intéressant. Merci aussi pour les commentaires, qui permettent de voir différentes façon de dissocier un processuce du terminal
Je pense que chaque commande a ses avantages et ses inconvénients, et que sage est celui qui les utilise toutes au bon moment
Bonjour,
Désolé de déterrer ce sujet. J'espère que je trouverais quand même quelqu'un pour m'éclairer.
Après avoir utilisé la commande nohup et fermé la session ssh, si on se reconnecte à la VM, est il possible de vérifier si le processus tourne toujours ?
Merci d'avance
@kevho1 : Pour voir ce qui tourne, il faut utiliser la commande "top"
Si tu recherche un programme en particulier :
top | grep "nom_du_programme"