İ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
foo
yaratı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 (
SIGHUP
a 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
foo
yaratı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
jobs
ve erişilebilir %n
( n
iş numarası nerede ).
- Kullanmadan kullanmışsınız
fg
gibi 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
SIGHUP
a 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 disown
işi kabuğun iş listesinden kaldırır, bu nedenle yukarıdaki tüm alt noktalar artık geçerli değildir (bir SIGHUP
kabuk tarafından gönderilen işlem dahil ). Bununla birlikte, hala terminale bağlı olduğunu not ediniz , yani terminal tahrip edilmişse (bu, xterm
veya tarafından yaratılanlar gibi küçük bir şey olduğunda gerçekleşebilir ssh
ve 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 nohup
yapar, 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 nohup
yok değil aynı zamanda kabuk işi kontrolünden sürecini kaldırmak ve arka planda koymuyor (ancak bir ön plan beri nohup
iş 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.
disown
iş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.out
ve 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).