it-swarm-tr.com

Nohup, disown ve & arasındaki fark

Arasındaki farklar nelerdir

$ Nohup foo

ve

$ foo &

ve

$ foo & 
$ disown
600
lesmana

İlk olarak, bir program & (ve yönlendirme olmadan). Diyelim ki foo yazdınız:

  • foo çalıştıran işlem oluşturulur.
  • İşlem stdin, stdout ve stderr'i Shell'den devralır. Bu nedenle aynı terminale de bağlanır.
  • Kabuk bir SIGHUP alırsa, işleme bir SIGHUP gönderir (normalde işlemin sona ermesine neden olur).
  • Aksi takdirde, kabuk süreç sona erene kadar bekler (engellenir).

Şimdi, süreci arka plana koyarsanız ne olur bakalım, yani foo &:

  • foo çalıştıran işlem oluşturulur.
  • İşlem stdout/stderr öğesini Kabuktan devralır (böylece yine de terminale yazar).
  • Prensip olarak süreç de stdin'i miras alır, ancak stdin'den okumaya başlar başlamaz durdurulur.
  • Shell'in yönettiği arka plan işleri listesine eklenir, bu da özellikle şu anlama gelir:
    • jobs ile listelenir ve %n (burada n iş numarasıdır).
    • fg kullanılarak bir ön plan işine dönüştürülebilir, bu durumda & üzerinde (ve standart girişten okumaya çalışılması nedeniyle durdurulmuşsa, şimdi terminalden okumaya devam edebilir).
    • Kabuk bir SIGHUP aldıysa, işleme bir SIGHUP gönderir. Kabuğa ve muhtemelen Kabuk için ayarlanan seçeneklere bağlı olarak, Kabuğu sonlandırırken işleme SIGHUP gönderir.

Şimdi disown işi Kabuk'un iş listesinden kaldırdığından yukarıdaki tüm alt noktalar artık geçerli değildir (Kabuk tarafından SIGHUP gönderilmesi dahil). Ancak still terminale bağlandığını unutmayın, bu nedenle terminal yok edilirse (bu bir pty ise olabilir, örneğin xterm veya ssh, ve kontrol programı xterm kapatılarak veya SSH bağlantısı) sonlandırılarak sonlandırılır, program okumaya çalıştığında başarısız olur standart giriş veya yazma standart çıkış.

Öte yandan, Nohup 'ın yaptığı şey, işlemi terminalden etkili bir şekilde ayırmaktır:

  • Standart girişi kapatır (program değil ön planda çalıştırılsa bile herhangi bir girişi okuyabilir. durdurulmaz, ancak bir hata kodu veya EOF) alır.
  • Standart çıktıyı ve standart hatayı Nohup.out, böylece terminal başarısız olursa program standart çıktıya yazmak için başarısız olmaz, bu nedenle işlem ne yazarsa kaybolmaz.
  • Sürecin SIGHUP (dolayısıyla ad) almasını engeller.

Nohup değil işlemi Kabuğun iş denetiminden kaldırdığına ve aynı zamanda arkaplana koymadığına dikkat edin (ancak bir ön plan Nohup işi olduğundan az ya da çok işe yaramazsa, genellikle &). Örneğin, disown 'dan farklı olarak, Kabuk Nohup işinin ne zaman tamamlandığını size söyleyecektir (Kabuk daha önce sonlandırılmadıkça, elbette).

Özetlemek gerekirse:

  • & işi arka plana koyar, yani girdiyi okuma girişimini engeller ve Kabuğun tamamlanmasını beklememesini sağlar.
  • disown işlemi Shell'in iş denetiminden kaldırır, ancak yine de terminale bağlı bırakır. Sonuçlardan biri Shell'in SIGHUP göndermeyeceğidir. Açıkçası, yalnızca arka plan işlerine uygulanabilir, çünkü bir ön plan işi çalışırken giremezsiniz.
  • Nohup, işlemin terminalden bağlantısını keser, çıkışını Nohup.out ve SIGHUP 'dan korur. Efektlerden biri (adlandırma), işlemin gönderilen SIGHUP iletisini almamasıdır. İş kontrolünden tamamen bağımsızdır ve prensip olarak ön plan işleri için de kullanılabilir (bu çok yararlı olmasa da).
595
celtschk

& Kullanılması, programın arka planda çalışmasına neden olur, böylece program bitene kadar engelleme yerine yeni bir Kabuk İstemi alırsınız. Nohup ve disown büyük ölçüde ilişkisizdir; SIGHUP (kapatma) sinyallerini bastırırlar, böylece kontrol terminali kapatıldığında program otomatik olarak öldürülmez. Nohup iş ilk başladığında bunu yapar. Bir işi başladığında Nohup yapmazsanız, çalışan bir işi değiştirmek için disown kullanabilirsiniz; hiçbir argüman olmadan, o sadece arka plan olan mevcut iş değiştirir

174
Michael Mrozek

İşte sonlandırılmamış bir komutu (örn. tail) takip ederek arka planda soffice çalıştırmaya çalışıyorum. Bu örnek için sleep 100.

&

#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

Ben bkz. Soffice Günlükler/tuşuna basarak Ctrl-C soffice durur

Hayır .. &

#!/bin/bash
Nohup /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

Ben görmüyorum soffice günlükler/tuşuna basarak Ctrl-C soffice durur

& reddetme

#!/bin/bash
/opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard & disown
sleep 100

Ben bkz. Soffice Günlükler/tuşuna basarak Ctrl-C soffice durur

set kimliği .. &

#!/bin/bash
setsid /opt/libreoffice4.4/program/soffice -invisible -nofirststartwizard &
sleep 100

Ben bkz. Soffice Günlükler/tuşuna basarak Ctrl-C soffice DURMUYOR

Yer kazanmak için:
Nohup setsid ..: günlükler/soffice göstermiyor DURMUYOR Ctrl-C
Nohup ve & disown sonunda: günlükleri göstermiyor/soffice açık Ctrl-C

9
Marinos An