Nohup, disown ve & arasındaki fark


579

Arasındaki farklar nelerdir

$ nohup foo

ve

$ foo &

ve

$ foo & 
$ disown

50
Bekle, bir PID belirtmeden vazgeçebilir misin? Harika!
ripper234

34
Aynı zamanda foo &!onu en başından uzaklaştırmaya eşit olması gereken de var .
kullanıcı4514

26
Bash desteklemiyor &!
Jonas Kongslund

20
foo & disownhemen reddetmek için.
ctrl-alt-delor,

9
Ben bir söz görmek isteriz setsidve nasıl ilgilidir disownvenohup
YoungFrog

Yanıtlar:


558

İlk önce bir program etkileşimli bir kabuktan (bir terminale bağlı) olmadan &(ve herhangi bir yönlendirmeden) başlatılırsa ne olduğuna bakalım . Öyleyse az önce yazdığınızı varsayalım foo:

  • Çalışan işlem fooyaratıldı.
  • İşlem, stdin, stdout ve stderr'yi kabuktan devralır. Bu nedenle aynı terminale de bağlanır.
  • Kabuk bir a alırsa , sürece ( SIGHUPa SIGHUP, işlemin sonlandırılmasına neden olan) işleme de a gönderir .
  • Aksi takdirde, kabuk, işlem sona erene kadar bekler (engellenir).

Şimdi, işlemi arkaplana koyarsanız ne olacağına bakalım foo &:

  • Çalışan işlem fooyaratıldı.
  • İşlem, stdout / stderr öğesini kabuktan devralır (bu yüzden hala terminale yazar).
  • Prensip olarak süreç aynı zamanda stdin'i de devralır, ancak stdin'den okumaya çalıştığı anda durdurulur.
  • Kabuğun yönettiği arkaplan işleri listesine dahil edilmiştir, bu özellikle:
    • İle listelenir jobsve erişilebilir %n( niş numarası nerede ).
    • Kullanmadan kullanmışsınız fggibi devam ettiği durumlarda devam &eder (ve eğer standart girdiden okumaya çalışarak durduysa, artık terminalden okumaya devam edebilir).
    • Kabuk a aldıysa , işleme SIGHUPa da gönderir SIGHUP. Kabuğa ve büyük olasılıkla kabuk için ayarlanan seçeneklere bağlı olarak, kabuğu sonlandırırken işlemi de a gönderir SIGHUP.

Şimdi disownişi kabuğun iş listesinden kaldırır, bu nedenle yukarıdaki tüm alt noktalar artık geçerli değildir (bir SIGHUPkabuk tarafından gönderilen işlem dahil ). Bununla birlikte, hala terminale bağlı olduğunu not ediniz , yani terminal tahrip edilmişse (bu, xtermveya tarafından yaratılanlar gibi küçük bir şey olduğunda gerçekleşebilir sshve kontrol programı, xterm kapatılarak veya SSH bağlantısını sonlandırarak sona erebilir ) program standart girdiden okumaya başlar veya standart çıktıya yazmaya başlar başlamaz.

Ne nohupyapar, diğer taraftan, etkin bir terminalden süreci ayırmaktır:

  • Bu standart girdi (program olacak kapatır değil durduğunu değildir. Ön planda çalışan bile, herhangi bir giriş okuyabilir, ancak bir hata kodu veya alacak EOF).
  • Standart çıktıyı ve standart hatayı dosyaya yönlendirir nohup.out, böylece terminal başarısız olursa programın standart çıktıya yazması başarısız olur, bu nedenle işlem ne olursa olsun yazmaz.
  • Sürecin almasını engeller SIGHUP(bu nedenle adı).

Not nohupyok değil aynı zamanda kabuk işi kontrolünden sürecini kaldırmak ve arka planda koymuyor (ancak bir ön plan beri nohupiş az ya da çok işe yaramaz, genellikle kullanarak arka plana koyarlardı &). Örneğin, aksine disown, kabuk, nohup işinin ne zaman tamamlandığını size söyleyecektir (kabuk daha önce elbette sonlandırılmadığı sürece).

Özetlemek gerekirse:

  • & işi arka planda tutar, yani girişi okumaya çalışmasını engeller ve kabuğun tamamlanmasını beklememesini sağlar.
  • disownişlemi kabuğun iş denetiminden kaldırır, ancak yine de terminale bağlı bırakır. Sonuçlardan biri kabuğun a göndermeyeceğidir SIGHUP. Açıkçası, yalnızca arka plan işlerine uygulanabilir, çünkü bir ön plan çalışırken giremezsiniz.
  • nohupİşlemi terminalden ayırır, çıktısını yönlendirir nohup.outve onu korur SIGHUP. Etkilerinden biri (isimlendirme), sürecin gönderilenleri alamayacağı yönündedir SIGHUP. İş kontrolünden tamamen bağımsızdır ve prensip olarak ön planlı işler için de kullanılabilir (bu çok kullanışlı olmasa da).

8
+1 Teşekkürler. Disown, nohup ve & birlikte kullanıldığında ne olur?
Tim

15
Üçünü birlikte kullanırsanız, işlem arka planda çalışır, kabuğun iş kontrolünden kaldırılır ve terminalden etkin bir şekilde çıkarılır.
celtschk


1
disown %1ve arasındaki fark disown -h %1nedir? İkincisi, terminal çıkana kadar normal bir iş olarak kalacaktır (ancak HUP sinyalini yoksayar)?
şemalar

4
Dahil Belki değerinde (foo&)altkabuk
jiggunjer

169

Kullanmak &, programın arka planda çalışmasına neden olur, böylece program sona erene kadar engelleme yerine yeni bir kabuk istemi alırsınız. nohupve disownbüyük ölçüde ilgisizdir; SIGHUP (hangup) sinyallerini bastırırlar, böylece kontrol terminali kapandığında program otomatik olarak öldürülmez. nohupİş ilk başladığında bunu yapar. Başladığında nohupbir iş yapmazsanız , disownçalışan bir işi değiştirmek için kullanabilirsiniz ; argüman olmadan, sadece arkaplanı yapılmış olan mevcut işi değiştirir.


10
Nohup ve disown arasındaki küçük fark: disown komutu iş listenizden kaldıracak; Nohup olmaz.
Shawn J. Goff,

191
nohupve disownher ikisinin de bastırdığı söylenebilir SIGHUP, ancak farklı şekillerde. nohupprogramın başlangıçta sinyali görmezden gelmesini sağlar (program bunu değiştirebilir). nohupayrıca programın denetleyici bir terminale sahip olmamasını sağlamaya çalışır, böylece SIGHUPterminal kapalıyken çekirdek tarafından gönderilmez . disowntamamen kabuğa içseldir; SIGHUPsonlandığında kabuğun göndermemesine neden olur .
Gilles

27
@Gilles, yorumun bir cevabı kendine değer.
lesmana

5
@ ShawnJ.Goff'un disownişi listeden çıkarmasıyla ilgili yorumuna bir açıklama yapıldı . Bir seçenek belirtmezseniz, bunu iş listesinden kaldırır. Ancak belirttiğiniz takdirde -hseçeneği, her jobspec edilir değil tablosundan kaldırılır. Bunun yerine, SIGHUPeğer kabuk a alırsa işe gönderilmeyecek şekilde yapılır SIGHUP.
tacotuesday

4
Sadece kullanarak netleştirmek için &o detaches size bir terminali vermez stdinsürecinden ve arka planda çalışmasını sağlar, ancak her iki stdoutve stderrhala geçerli tty'den takılır. Bu, birbiriyle karıştırılmış farklı programlardan metin alabileceğiniz anlamına gelir; gimp &bu tty'yi başka bir şey için kullanmaya çalışırken çok fazla GTK + hatası alırsanız çok can sıkıcı olabilir .
Frank

8

İşte deneyimim bitmeyen bir komutu (örn. tail) İzleyerek arka planda yumuşaklığı çalıştırmaya çalışmak . Bu örnek için kullanacağım sleep 100.

&

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

Ben bkz soffice günlükleri / basarak Ctrl- Csoffice durur

nohup .. &

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

Ben görmüyorum soffice günlükleri / basarak Ctrl- Csoffice durur

& reddetme

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

Ben bkz soffice günlükleri / basarak Ctrl- Csoffice durur

setsid .. &

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

Ben bkz soffice günlükleri / basarak Ctrl- Csoffice DUR ETMEZ

Yer kazanmak için:
nohup setsid ..: günlükleri göstermiyor / soffice üzerinde durmuyor Ctrl-C
nohup ile & disownsonunda: günlükleri göstermiyor / soffice üzerinde durur Ctrl-C


2
Setid'den bahsetme ve bu özel durumda ne olduğunu gösterme çabasını takdir ederken, daha ayrıntılı bir cevap görmek istiyorum. Özellikle, her bir çözümün farklılığı ve benzerlikleri, hem görünür (kabuk veya terminale yakın olduğunda ne olur, çıktı nereye gidiyor,…) ve görünmez (başlık altında işlerin nasıl yapıldığı ve sonuçları) görünmez. Kabul edilen cevap bunun için iyi bir temeldir.
YoungFrog

1
@YoungFrog Bu konuda hemfikirim!
Marinos An

Benim nohup ⟨command⟩ & disowniçin oluşturulan süreçle bitmiyor Ctrl+C.
k.stm

@ k.stm Denediniz mi soffice? sofficekomut farklı bir şeye sahip görünüyor. Bu yüzden buraya bir kural dışı durum olarak eklemeyi düşündüm. örneğin: kullanırken: normal şekilde nohup .. &basılması Ctrl-ckomutun durmasına neden olmaz, sofficeonunla birlikte yapar. Birisi bunun üzerine adım atıp bunun neden soffice ile gerçekleştiğini açıklayana kadar bekliyorum :)
Marinos An

@MarinosAn Evet, yaptım. Koştum nohup soffice &ve bastım Ctrl+C. Beklendiği gibi hiçbir şey olmadı.
k.stm
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.