`Disown -h` e` nohup` funzionano allo stesso modo?


18

disown

  • fa sì che una shell non invii SIGHUP al suo lavoro sconosciuto al termine della shell e

  • rimuove il lavoro sconosciuto dal controllo del lavoro della shell.

Il primo è il risultato del secondo? In altre parole, se un processo avviato da una shell viene rimosso dal controllo del processo della shell in qualche modo, la shell non invierà SIGHUP al processo al termine della shell?

disown -h mantiene ancora un processo sotto il controllo del lavoro di una shell. Significa che disown -hfare in modo che un processo riceva ancora SIGHUP inviato dalla shell, ma imposta l'azione di SIGHUP da parte del processo in modo da essere "ignorato"? Sembra simile a 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

Funzionano disown -he nohupfunzionano in modo efficace allo stesso modo, se ignoriamo la loro differenza nell'uso di un terminale?

Grazie.


Un'altra differenza non discussa qui è che se non si utilizza nohup, è necessario reindirizzare stdin / stdout / stderr lontano dal TTY (se la shell originale deve essere connessa a te). (OTOH, in realtà considero quella pratica migliore che fare affidamento su un default egocentrico hardcoded come ./nohup.out).
Charles Duffy,

Risposte:


21

nohupe disown -hnon sono esattamente la stessa cosa.

Con disown, un processo viene rimosso dall'elenco dei lavori nella shell interattiva corrente. L'esecuzione jobsdopo l'avvio di un processo in background e l'esecuzione disownnon mostreranno tale processo come processo nella shell. Un lavoro sconosciuto non riceverà un HUPdalla shell quando esce (ma vedere la nota alla fine).

Con disown -h, il lavoro non viene rimosso dall'elenco dei lavori, ma la shell non invierà un HUPsegnale se uscisse (ma vedere la nota alla fine).

L' nohuputilità ignora il HUPsegnale e avvia l'utilità specificata. L'utilità eredita la maschera del segnale nohupe pertanto ignora anche il HUPsegnale. Quando la shell termina, il processo rimane come processo figlio di nohup(ed nohupè ricomposto init).

La differenza è che il processo iniziato con nohupignora HUPindipendentemente da chi invia il segnale. I processi sconosciuti non vengono semplicemente inviati un HUPsegnale dalla shell , ma possono comunque essere inviati il ​​segnale da ad esempio kill -s HUP <pid>e non lo ignoreranno.

Si noti che HUPviene inviato ai lavori di una shell solo se

  • la shell è una shell di login e l' huponexitopzione shell è impostata, o
  • lo stesso guscio riceve un HUPsegnale.

Bit rilevanti dal bashmanuale (la mia enfasi):

SEGNALI

[...]

La shell esce di default alla ricezione di aSIGHUP . Prima di uscire, una shell interattiva rinvia SIGHUPa tutti i lavori, in esecuzione o arrestati. I lavori interrotti vengono inviati SIGCONTper garantire che ricevano il SIGHUP. Per impedire alla shell di inviare il segnale a un particolare lavoro, è necessario rimuoverlo dalla tabella dei lavori con disownincorporato (vedere di SHELL BUILTIN COMMANDSseguito) o contrassegnare per non ricevere SIGHUP utilizzando disown -h.

Se l' huponexitopzione shell è stata impostata con shopt, bashinvia un SIGHUPa tutti i lavori quando esce una shell di login interattiva.

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

Senza opzioni, rimuoverli tutti jobspecdalla tabella dei lavori attivi. [...] Se -hviene fornita l' opzione, ognuna nonjobspec viene rimossa dalla tabella, ma è contrassegnata in modo tale da SIGHUPnon essere inviata al lavoro se la shell riceve unSIGHUP . [...]

Relazionato:


Ottengo lo bash: disown: nohup: no such jobstesso per sleepe 5da disown nohup sleep 5 &. Cosa intendevi con quel secondo comando dell'ultima frase?
Ruslan,

@Ruslan Sì, mi manca un file &lì dentro (e l'ordine di nohuped disownera anche sbagliato). Grazie. Si aggiornerà ora.
Kusalananda


@Tim Ci scusiamo per l'eccessiva modifica della risposta. Ci è voluto un po 'per capovolgerlo. Ho finito ora.
Kusalananda

Grazie. disowncrea una shell che non ha inviato SIGHUP a un figlio rimuovendolo dall'elenco dei lavori della shell. Come si disown -hottiene lo stesso?
Tim

4

Sono diversi:

  • disown rimuove il lavoro dalla tabella dei lavori attivi. Quindi continua con il lavoro corrente. Con -h il processo NON viene inviato SIGHUP. Viene invece lasciato morire con la shell che lo contiene, quando riceve un SIGHUP.

  • nohup ignora l'HUP. Quindi tutto ciò che sarebbe stato passato al terminale dalla chiusura del processo andrà invece a un file nohup.out.

    nohup è definito da POSIX mentre non lo è.


Cosa intendi con "muori con la conchiglia che lo contiene"? Uccidere un processo genitore non comporta di per sé un figlio. I programmi i cui terminali sono chiusi in genere muoiono a causa di guasti relativi ai tentativi di interazione con un handle di file collegato al PTY del terminale, ma se stdin / stdout / stderr vengono reindirizzati altrove, ciò non accadrà.
Charles Duffy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.