Hangi durumlarda SIGHUP oturumu kapattığınızda bir işe gönderilmez?


10

Çalıştığını iddia eden bir kullanıcıdan yanıt okudum

foo 2>&1 >& output.log &

neden olacaktır fooonlar çıkış yaptığınızda da çalışmaya devam. Bu kullanıcıya göre, bu SSH bağlantıları üzerinde bile çalıştı.

SSH ile bağlantıyı kesme veya TTY'yi sona erdirme durumunda, kabuğun ve dolayısıyla süreçlerinin bir SIGHUP alacağına inanıyorum. Bu, benim varsayımı altında, kullanılmasının tek sebebi oldu nohupgibi durumlarda ya tmux, screenvd.

Sonra glibc'in el kitabına baktım :

Bu sinyal ayrıca bir terminaldeki kontrol sürecinin sonlandırılmasını o oturumla ilişkili işlere rapor etmek için kullanılır; bu sonlandırma oturumdaki tüm süreçleri kontrol terminalinden etkili bir şekilde ayırır.

Bu düşüncelerimi teyit ediyor gibi görünüyor. Ama daha ileriye baktığımızda diyor ki :

İşlem, kontrol terminali olan bir oturum lideriyse, ön plan işindeki her işleme bir SIGHUP sinyali gönderilir ve kontrol terminali bu oturumdan ayrılır.

Yani, demek işler olacak arka planda sokuyor değil SIGHUP alma?

Daha fazla karışıklığım için, etkileşimli bir Zsh oturumu yürüttüm, koştum yes >& /dev/null &ve exityazdım, Zsh beni iş yaptığım konusunda uyardığında ve exitikinci bir kez yazdıktan sonra , bir işin SIGHUPed olduğunu söyledi. Bash'te tam olarak aynısını yapmak işi devam ettirir ...


Geçmişte ssh üzerinden aniden kesilen bir sunucu ile sorun yaşadım ve işlemim çalışmaya devam etti, ancak herhangi bir tty olmadan, bu yüzden tekrar giriş yapmak ve onları sona erdirmek için SIGHUP / TERM / KILL göndermek zorunda kaldım. Yani, aynı mantığı takip ederek, şimdi test ettim, yazdım logoutve yeshala çalışıyor.
Braiam

SIGHUP'un gönderilip gönderilmemesine ek olarak, bir işlemin bir sinyal işleyici tanımlayıp (ve SIGHUP'ı yakaladığını) veya sinyal maskesinin bu sinyali gönderildiğinde sonlandırılıp sonlandırılmayacağı ek faktörlerdir. Çıkıştan sonra çalışmaya devam etmesi, o sinyalin gönderilmediği anlamına gelmez
Tim B

Bu soruya mı başvuruyorsunuz : serverfault.com/questions/115999/… ? Cevap orada görünüyor - RedHat varsayılan olarak shopt ayarlamıyor. RedHat'ın özel yapılandırma sorunu.
Boris Burkov

@Bob Hayır, bunu daha önce görmedim, ama iyi bir kaynak. Teşekkürler!
slhck

Yardımcı oldu sevindim. Aslında Raphael de bu konuya değiniyor.
Boris Burkov

Yanıtlar:


18

Bash, SIGHUPyalnızca SIGHUPbir sanal terminal kapatıldığında veya SSH bağlantısı kesildiğinde gerçekleşen bir kendi kendine a alırsa gönderir . Gönderen belgeler :

Bir SIGHUP alındıktan sonra kabuk varsayılan olarak çıkar. Çıkmadan önce, etkileşimli bir kabuk SIGHUP'u çalışan veya durdurulmuş tüm işlere yeniden gönderir. Durdurulmuş işler SIGHUP aldıklarından emin olmak için SIGCONT'a gönderilir. Kabuğun SIGHUP sinyalini belirli bir işe göndermesini önlemek için, reddedilen yerleşik (bkz. Job Control Builtins) olan iş tablosundan kaldırılmalı veya -H disown kullanılarak SIGHUP alınmayacak şekilde işaretlenmelidir.

Bu nedenle , Bash'e bir kapatma sinyali göndermediği için + yazarsanız exitveya Ctrl+ tuşuna basarsanız Dtüm arka plan işlemleri kalır.

Bash'i, hala arka plan süreçleri olduğu konusunda sizi uyarmaya zorlayabilirsiniz.

shopt -s checkjobs

SIGHUPEtkileşimli bir kabuktaysanız çıkışa gönderme seçeneği vardır ( buraya bakın ). Ancak Bash 4.2.25 ile makinemde çalışmıyor. Belki senin için çalışır

shopt -s huponexit

Peki, bir SSH bağlantısı kesildiğinde, SIGHUPtemiz bir çıkışla gönderilirse, işler devam ediyor mu? Bu gördüğümü açıklıyor.
slhck

Evet. Telefonu kapatma sinyali, kullanıcıyla bağlantı kesildiğinde sadece özel durum için vardır.
Raphael Ahrens



@npostavs Cevaba eklediğim bilgiler için teşekkürler.
Raphael Ahrens
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.