55 votes

Différences entre "<commande> & disown" et "nohup <commande> & disown"

Ceci est ma compréhension de l'utilisation de &, disown et nohup:

  • : exécute le processus dans l'instance actuelle de bash du Terminal, en premier plan (c'est-à-dire que le processus est répertorié comme un travail de premier plan de bash et stdin, stdout et stderr sont toujours liés au terminal); pas immunisé contre les raccrochages;
  • &: exécute le processus dans l'instance actuelle de bash du Terminal, en arrière-plan (c'est-à-dire que le processus est répertorié comme un travail en arrière-plan de bash et stdin, stdout et stderr sont toujours liés au terminal); pas immunisé contre les raccrochages;
  • & disown: exécute le processus dans l'instance actuelle de bash du Terminal, en arrière-plan, mais le processus est détaché de la liste des travaux de bash (c'est-à-dire que le processus n'est pas répertorié comme un travail de premier plan / arrière-plan de bash et stdin, stdout et stderr sont toujours liés au terminal); immunisé contre les raccrochages;
  • nohup & disown: exécute le processus dans l'instance actuelle de bash du Terminal, en arrière-plan, mais le processus est détaché de la liste des travaux de bash (c'est-à-dire que le processus n'est pas répertorié comme un travail de premier plan / arrière-plan de bash et stdin, stdout et stderr ne sont plus liés au terminal); immunisé contre les raccrochages;

Donc, à part le fait que nohup & disown bloque stdin et redirige stdout et stderr vers nohup.out par défaut, il me semble que cela peut être considéré comme totalement équivalent à & disown.

Est-ce que tout ce qui précède est correct ? Y a-t-il une confusion ?

48voto

Stewart Points 1385

Votre compréhension est essentiellement correcte. Les commandes disown et nohup sont utilisées pour vous permettre de quitter une session shell en cours d'exécution sans arrêter les tâches en cours. Quelques clarifications :

  • Il n'y a aucune raison d'exécuter nohup commande & disown, nohup va déjà le désolidariser pour vous.

  • nohup est défini par POSIX alors que disown ne l'est pas. Cela signifie que tandis que de nombreux shells (par exemple bash, zsh, ksh) le possèdent, d'autres (par exemple tcsh, csh, dash et sh) ne l'auront pas.

  • disown peut être utilisé après le lancement d'une commande tandis que nohup doit être utilisé avant.

Autant que je sache, l'effet réel des deux commandes est le même. Elles ont chacune des fonctionnalités que l'autre n'a pas (voir aide disown et man nohup) mais leur fonction de base est la même, oui.

Pour une discussion beaucoup plus détaillée sur ces outils et les différences entre eux, consultez les réponses ici :

7voto

heemayl Points 85741

Vos première à troisième points semblent corrects, bien que stdin, stdout et stderr sont toujours liés au terminal ne soit pas une bonne notion. stdin est toujours lié au terminal dans le sens où vous saisiriez toujours le nom du fichier à une commande via le terminal ou d'autres moyens utilisant le terminal. stdout et stderr sont toujours liés au terminal est correct.

Vous avez stdin, stdout et stderr ne sont pas encore liés au terminal dans le quatrième point, ce qui n'est pas correct comme mentionné dans mon paragraphe précédent. De plus, vous utilisez /dev/null comme fichier d'entrée pour la commande, par exemple si la commande est cat, vous l'utilisez comme cat /dev/null.

La commande de votre 5ème point n'est pas correctement formulée, vous avez utilisé nohup & disown, en utilisant l'un des deux nohup ou disown l'autre n'est pas nécessaire. Leur objectif est le même (ignorer le SIGHUP) mais ils fonctionnent un peu différemment. Ainsi, la commande peut être simplifiée en nohup &.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X