`-H` ve` nohup` reddetme aynı şekilde etkili midir?


18

disown

  • bir kabuk, kabuk sona erdiğinde SIGHUP'u vazgeçilmez işine göndermemesine neden olur ve

  • reddedilen işi kabuğun iş denetiminden kaldırır.

Birincisi ikincisinin sonucu mu? Başka bir deyişle, bir kabuktan başlatılan bir işlem, kabuğun iş denetiminden herhangi bir şekilde kaldırılırsa, kabuk, kabuk sona erdiğinde işleme SIGHUP göndermez mi?

disown -h bir işlemi hala kabuğun iş kontrolü altında tutar. disown -hBir işlemin kabuktan gönderilen SIGHUP değerini almaya devam etmesi, ancak SIGHUP eylemini bu işlem tarafından "yoksay" olarak ayarladığı anlamına mı geliyor ? Kulağa benziyor 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

Bir terminal kullanımındaki farklılıklarını göz ardı edersek, aynı şeyi yapın disown -hve nohupetkili bir şekilde çalışın mı?

Teşekkürler.


Burada tartışılmayan bir başka fark, eğer kullanmıyorsanız nohup, stdin / stdout / stderr'i TTY'den (orijinal kabuğunuz birine bağlıysa) kendinize yönlendirmeniz gerektiğidir. (OTOH, aslında bu gibi berbat bir sabit kodlu temerrüde güvenmekten daha iyi bir uygulama olduğunu düşünüyorum ./nohup.out).
Charles Duffy

Yanıtlar:


21

nohupve disown -holmayan tam aynı şey.

İle disown, bir işlem geçerli etkileşimli kabuktaki işler listesinden kaldırılır. Koşu jobsarka plan işlemine başlamadan ve çalıştırdıktan sonra disownkabuk içinde bir iş olarak bu süreci göstermez. Vazgeçilen bir iş HUP, kabuktan çıkarken bir kabuk alamaz (ancak sonunda nota bakın).

İle disown -h, iş, işler listesinden kaldırılmaz, ancak kabuk HUPçıkmışsa ona bir sinyal göndermez (ancak sonunda nota bakın).

Yardımcı nohupprogram HUPsinyali yoksayar ve verilen yardımcı programı başlatır. Yardımcı program sinyal maskesini devralır nohupve bu nedenle HUPsinyali de göz ardı eder . Kabuk sona erdiğinde, işlem bir alt süreç olarak kalır nohup(ve buna nohupyeniden eşleştirilir init).

Aradaki fark, sinyali kimin gönderdiğine bakılmaksızın sürecin nohupgöz ardı HUPedilmesidir. Reddedilen süreçler sadece kabuk tarafından bir sinyal gönderilmez , ancak yine de örn .HUPkill -s HUP <pid>

Not HUPsadece bir kabuk eğer işler gönderilir

  • kabuk bir giriş kabuğudur ve huponexitkabuk seçeneği ayarlanmıştır veya
  • kabuğun kendisi bir HUPsinyal alır.

bashKılavuzdaki ilgili bitler (benim vurgularım):

SİNYALLERİ

[...]

Kabuk a alındıktan sonraSIGHUP varsayılan olarak çıkar . Çıkmadan önce, etkileşimli bir kabuk SIGHUPçalışan veya durdurulan tüm işlere yeniden gönderilir . Durdurulan işler gönderilmesini SIGCONTsağlamak için gönderilir SIGHUP. Kabuğun sinyali belirli bir işe göndermesini önlemek için, disownyerleşik olan iş tablosundan kaldırılmalıdır (bkz.SHELL BUILTIN COMMANDS aşağıda) ya da alırsınız değil işaretlenmiş SIGHUP kullanarak disown -h.

Eğer huponexitkabuk seçeneği ile kurulmuştur shopt, bashbir gönderen SIGHUPtüm işlerin interaktif bir giriş kabuğu çıkarken için.

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

Seçenekler olmadan, her jobspecbirini etkin işler tablosundan kaldırın . [...] -hSeçenek belirtilirse, her jobspecbiri tablodan kaldırılmaz , ancak kabuk bir alan alırsa işe gönderilmeyecek şekilde işaretlenirSIGHUPSIGHUP . [...]

İlişkili:


Elde bash: disown: nohup: no such jobve aynı için sleepve 5gelen disown nohup sleep 5 &. Son cümleden bu ikinci komutla ne demek istediniz?
Ruslan

@Ruslan Evet &Orada bir eksik (ve sırası nohupve disownayrıca yanlış). Teşekkürler. Şimdi güncellenecek.
Kusalananda


@ Zaman Cevabın aşırı düzenlenmesi için üzgünüm. Başımı etrafında tutmak biraz zaman aldı. Şimdi bitti.
Kusalananda

Teşekkürler. disownçocuğu kabuğun iş listesinden çıkararak SIGHUP gönderilmeyen bir mermiyi yapar. disown -hAynısını nasıl başarıyor ?
Tim

4

Onlar farklı:

  • disown, işi etkin işler tablosundan kaldırır. Ardından mevcut işe devam eder. -H ile işlem DEĞİLDİR SIGHUP gönderilir. Bunun yerine bir SIGHUP aldığında onu içeren kabukla ölmeye bırakılır.

  • nohup, HUP'u yok sayar. Sonra işlem kapanışıyla terminale geçirilecek her şey bir dosyaya gidernohup.out .

    nohup, reddedilmediği halde POSIX tarafından tanımlanır.


Ne demek, "Onu içeren kabukla öl"? Bir ebeveyn sürecini öldürmek kendi başına bir çocuğu öldürmez. Terminalleri kapalı olan programlar genellikle terminalin PTY'sine eklenmiş bir dosya tanıtıcısı ile etkileşim girişimleriyle ilgili başarısızlıklar nedeniyle ölür, ancak stdin / stdout / stderr başka bir yere yönlendirilirse bu gerçekleşmez.
Charles Duffy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.