Différences entre “<command> & disown” et “nohup <command> & disown”

41

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

  • <command>: exécute le processus au sein de l' bashinstance actuelle du terminal , au premier plan (c'est-à-dire que le processus est répertorié en tant que bashtâche de premier plan et stdin, stdoutet stderrsont toujours liés au terminal ); pas à l'abri des blocages ;
  • <command> &: exécute le processus dans l’ bashinstance actuelle du terminal , en arrière-plan (c’est-à-dire que le processus est répertorié comme bashtravail en arrière - plan et stdin, stdoutet stderrsont toujours liés au terminal ); pas à l'abri des blocages ;
  • <command> & disown: exécute le processus au sein de l' bashinstance actuelle du terminal , en arrière-plan , mais le processus est détaché de la bashliste des 'travaux' (c'est-à-dire que le processus n'est pas répertorié en tant que travail d' bashavant-plan / en arrière-plan et stdin, stdoutet stderrsont toujours liés au terminal ); à l'abri des blocages ;
  • nohup <command> & disown: Exécute le processus dans le courant de terminal par bashexemple, en arrière - plan , mais le processus est détaché de la bashliste ' les emplois de (le processus ne figure pas comme un bashtravail de premier plan / arrière - plan et stdin, stdoutet stderrsont pas encore lié à la borne ) ; à l'abri des blocages ;

Ainsi, en dehors de nohup <command> & disownbloquer stdinet de rediriger stdoutet stderrà nohup.outpar défaut, il me semble que cela peut être considéré comme tout à fait équivalent à <command> & disown.

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

kos
la source
1
Qu'entendez-vous par "immunisé contre les accrochages" et "non immunisé contre les décrochements"?
chaos
2
@chaos Je veux dire que mettre fin / tuer l' bashinstance parent ne tuera pas le processus
kos

Réponses:

32

Votre compréhension est fondamentalement correcte. Les deux disownet nohupsont utilisés pour vous permettre de sortir d' une session shell en cours d' exécution sans arrêter tâches en cours. Quelques clarifications:

  • Il n'y a aucune raison de courir nohup command & disown, le nohupsera déjà désavoué pour vous.

  • nohupest défini par POSIX alors que disown non . Cela signifie que si beaucoup de coquilles (par exemple bash, zsh, ksh) l' ont, d' autres (par exemple tcsh, csh, dashet sh) ne l' auront pas.

  • disownpeut être utilisé après qu'une commande a été lancée alors que nohupdoit être utilisé avant.

Autant que je sache, l'effet réel des deux commandes est le même. Ils ont chacun des caractéristiques que l'autre manque (voir help disownet 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:

terdon
la source
11
Nohupet disownne sont pas la même chose et l'utilisation simultanée des deux commandes n'est PAS redondante. Voir cette réponse pour une description détaillée
mémo
7

Votre premier au troisième point semble correct, même si ce stdin, stdout and stderr are still bound to the terminaln’est pas une notion juste. stdinest toujours lié au terminal en ce sens que vous devez toujours saisir le nom du fichier dans une commande via un terminal ou par des moyens utilisant terminal. stdout and stderr are still bound to the terminalC'est bien.

Vous avez stdin, stdout and stderr are not still bound to the terminaldans le quatrième point ce qui n’est pas juste comme mentionné dans mon paragraphe précédent. Vous utilisez également ici /dev/nullle fichier d’entrée 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 l'utilisation de l'un nohupou disownl'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 comme nohup <command> &.

Heemayl
la source