web-dev-qa-db-fra.com

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

Voici ce que je comprends de l'utilisation de &, disown et Nohup:

  • <command>: exécute le processus dans l'instance bash actuelle du terminal, au premier plan (le processus est répertorié comme travail bash au premier plan et stdin, stdout et stderr sont toujours lié au terminal ); non immunisé contre les blocages ;
  • <command> &: exécute le processus dans l'instance actuelle du terminal bash du terminal, en arrière-plan (le processus est répertorié en tant que tâche d'arrière-plan bash et que stdin, stdout et stderr sont toujours lié au terminal ); non immunisé contre les blocages ;
  • <command> & disown: exécute le processus dans l'instance actuelle 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 ne figure pas dans la liste des tâches bash au premier plan/à l’arrière-plan et que les variables stdin, stdout et stderr sont toujours liées au terminal ); immunisé contre les blocages ;
  • Nohup <command> & disown: exécute le processus dans l'instance actuelle 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 ne figure pas dans la liste des tâches bash au premier plan/en arrière-plan et que stdin, stdout et stderr sont non toujours liés au terminal ); immunisé contre les blocages ;

Donc, mis à part le Nohup <command> & disown qui 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 à <command> & disown.

Le dessus est-il correct? Une idée fausse?

37
kos

Votre compréhension est fondamentalement correcte. disown et Nohup permettent de quitter une session Shell en cours d'exécution sans arrêter les travaux en cours. Quelques clarifications:

  • Il n'y a aucune raison d'exécuter Nohup command & disown, Nohup le désavouera déjà pour vous.

  • Nohup est défini par POSIX tandis que disownn'est pas . Cela signifie que si 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 une commande a été lancée alors que Nohup doit être utilisé auparavant.

Autant que je sache, l'effet réel des deux commandes est le même. Ils ont chacun des fonctionnalités qui manquent à l’autre (voir help disown et man Nohup) mais leur fonction de base est la même, oui.

Pour une discussion beaucoup plus détaillée de ces outils et de leurs différences, regardez les réponses ici:

27
terdon

Votre premier au troisième point semble correct, bien que stdin, stdout and stderr are still bound to the terminal ne soit pas une bonne notion. stdin est toujours lié au terminal en ce sens que vous saisissez toujours le nom du fichier dans une commande via un terminal ou par des moyens utilisant terminal. stdout and stderr are still bound to the terminal va bien.

Vous avez stdin, stdout and stderr are not still bound to the terminal dans le quatrième point qui n’est pas correct comme mentionné dans mon paragraphe précédent. Ici aussi, vous utilisez /dev/null en tant que fichier d'entrée de command, par exemple, si la commande est cat, vous l'utilisez en tant que cat /dev/null.

La commande sur votre 5ème point n'est pas correctement placée, vous avez utilisé Nohup <command> & disown, alors que vous utilisez l'un des Nohup ou disown l'autre n'est pas nécessaire. Leurs buts sont les mêmes (ignorer le SIGHUP) mais ils fonctionnent de manière légèrement différente. Donc, la commande peut être simplifiée en tant que Nohup <command> &.

7
heemayl