web-dev-qa-db-fra.com

Est-ce que `désaveux -h` et` nohup` travaillent efficacement la même chose?

disown

  • provoque une coquille de ne pas envoyer à SIGHUP à son travail désavoué lorsque la coquille se termine, et

  • supprime le travail désavoué à partir du contrôle d'emploi de Shell.

Est le premier résultat du deuxième? En d'autres termes, si un processus démarré à partir d'une coquille est retiré de la commande du travail de la coque de quelque manière que ce soit, la coquille n'enverra-t-elle pas de SIGHUP au processus lorsque la coque se termine?

disown -h conserve toujours un processus sous le contrôle d'un shell. Cela signifie-t-il que disown -h Le processus reçoit toujours SIGHUP envoyé de la coquille, mais fixe l'action de Sighup par le processus pour être "ignorer"? Cela semble semblable à Nohup.

$ sleep 123 & disown -h
[1] 26103
$ jobs
[1]+  Running                 sleep 123 &
$ fg 1
sleep 123
$ ^Z
[1]+  Stopped                 sleep 125
$ bg 1
[1]+ sleep 123 &
$ exit

$ ps aux | grep sleep
t        26103  0.0  0.0  14584   824 ?        S    15:19   0:00 sleep 123

Faire disown -h et Nohup _ Travailler efficacement la même chose, si nous ignorons leur différence d'utilisation d'un terminal?

Merci.

18
Tim

Nohup et disown -h Ne sont pas exactement ​​la même chose.

Avec disown, un processus est supprimé de la liste des emplois dans l'interface interactive actuelle Shell. Exécution jobs après le démarrage d'un processus d'arrière-plan et en cours d'exécution disown ne montrera pas ce processus comme un emploi dans le Shell. Un emploi désavoué ne recevra pas de Shell HUP quand il sort (mais voir la note à la fin).

Avec disown -h, Le travail n'est pas supprimé de la liste des emplois, mais Shell n'enverrait un signal HUP pour si elle est sortie (mais voir la note à la fin).

L'utilitaire Nohup ne tient pas compte du signal HUP et démarre l'utilitaire donné. L'utilitaire hérite du masque de signal de Nohup et ignore donc aussi le signal HUP. Lorsque le Shell, se termine le processus reste comme un processus enfant de Nohup (et Nohup est ré-apparenté à init).

La différence est que le processus a commencé avec Ignore NohupHUP quel que soit qui envoie le signal. Les processus désavoués sont tout simplement pas envoyés un signal HUPpar Shell, mais peuvent encore être envoyés le signal par exemple kill -s HUP <pid> Et ne l'ignorer.

Notez que HUP est envoyé uniquement aux emplois de Shell si

  • shell est une option Connexion Shell et Shell huponexit est réglé, ou
  • shell se reçoit un signal HUP.

Bits pertinents du manuel (je souligne) bash:

SIGNALS

[...]

Les sorties de Shell par défaut à la réception d'un SIGHUP. Avant de quitter, un shell interactif réémet la SIGHUP à tous les travaux, en cours d'exécution ou arrêté. Nous nous sommes arrêtés emplois sont envoyés SIGCONT pour veiller à ce qu'ils reçoivent le SIGHUP. Pour éviter Shell d'envoyer le signal à un emploi particulier, il doit être retiré de la table de l'emploi avec disown builtin (voir Shell BUILTIN COMMANDS Ci-dessous) ou marqué pour ne pas recevoir SIGHUP en utilisant disown -h.

Si le huponexit Option Shell a été réglée avec shopt, bash envoie un SIGHUP à tous les travaux quand une connexion interactive Shell sorties.

disown [-ar] [-h] [jobspec ... | pid ... ]

Sans options, supprimer chaque jobspec de la table des travaux actifs. [...] Si l'option -h Est donnée, chaque jobspec est ne sont pas retirés de la table, mais est marqué de telle sorte que SIGHUP n'est pas envoyé à l'emploi si le Shell reçoit un SIGHUP. [...]

En rapport:

21
Kusalananda

ils sont différents :

  • désigné supprime le travail de la table d'emplois active. Ensuite, continue avec le travail actuel. Avec -h le processus est [~ # ~] non [~ # ~] Sensible Sigion. Il est à la place de mourir avec la coquille qui le contient, lorsqu'il reçoit un soupirupaire.

  • NOHUP ignore le HUP. Ensuite, tout ce qui aurait été transmis au terminal par la fermeture de Pycs se rend à la place à un fichier Nohup.out.

    NOHUP est défini par POSIX tandis que le désavantage n'est pas.

4
Michael Prokopec