source

http://www.tux-planet.fr/utilisation-de-la-commande-nohup/

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.

La première ligne de commande ci-dessous démarre le programme mon_programme en tâche de fond de telle façon qu'une déconnexion ne l'arrêtera pas.

$ nohup mon_programme &

$ exit

Cet autre exemple montre comment rediriger la sortie vers un fichier texte autre que nohup.out (défaut).

$ nohup mon_programme > out.file &

Voici un exemple avec redirection de l'input standard pour éviter qu'il ne se bloque à la fermeture du terminal.

$ nohup mon_programme 0</dev/null &

screen

Autre commande, 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.

disown

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 messages 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").

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.

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 "nautilus". Pour rattraper la main, je tapes Ctrl+Z et bg, mais nautilus reste "attaché" à la console : si je quitte le terminal, nautilus se ferme aussi. C'est là que "disown %1" intervient : les deux applications 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.