Oturumu kapattıktan sonra neden işlemim hala çalışıyor?


10

Oturum açtıktan sonra sshbu komutu yazıyorum bash:

sleep 50000000000000 &

Sonra sürecin ana süreç (yani ). Ardından terminal penceresi aynı anda kesilir.kill -9sleepbash

Tekrar giriş yaptığımda, sleepsürecin hala hayatta olduğunu görüyorum .

Soru : sleepOturumu kapattığımda ve terminal kapandığında süreç neden hayatta kalabilir? Aklımda, nohupoturum kapatma sırasında cinler ve programlar dışında her şey öldürülecek. Eğer sleepbu şekilde yaşayabilir, ben yerine bu yöntemi kullanabilirsiniz anlamına gelmez nohupkomuta?


3
&işlemi arka plana (daemon gibi) çatacak ve oturumu kapatmış olmanıza rağmen çalışmaya devam edecektir.
Aizuddin Zali

Yanıtlar:


6

Tl; dr:

sleepOturumu kapattığımda ve terminal kapandığında neden süreç hayatta kalabilir? Aklımda, nohupoturum kapatma sırasında cinler ve programlar dışında her şey öldürülecek. Eğer sleepbu şekilde yaşayabilir, ben yerine bu yöntemi kullanabilirsiniz anlamına gelmez nohupkomuta?

Sürece bashtarafından kökenli örneği sshvardır huponexitseçeneği ayarlanmış, hiçbir işlem oturumu / Çıkışta herhangi ortalama tarafından sonlandırılır ve ne zaman huponexitopsiyon ayarlanır kullanılarak kill -9kabuk üzerinde kullanmanın iyi bir alternatif değildir nohupkabuğunuzun çocuk süreçlerine; nohupKabuğun alt süreçleri onları kabuktan gelmeyen YAVAŞLAR'dan koruyacaktır ve bu önemli olmasa bile nohupkabuğun incelikle sonlandırılmasına izin verdiği için hala tercih edilmelidir.


In bashadlı bir seçenek var huponexitseti yapacak olursa, bashSIGHUP çıkış / Çıkış yapıldığında alt öğeleri;

Etkileşimli oturum açma dışı bash durumlarda, bashörneğin ortaya çıktığı bir örnekte gnome-terminal, bu seçenek yoksayılır; huponexitset veya unset olsun , bashçocukları bashçıkışta asla SIGHUPped olmayacaktır ;

Oluşan bir örnek gibi etkileşimli oturum açma bash örneklerinde bu seçenek yok sayılmaz (ancak varsayılan olarak ayarlanmamıştır); eğer ayarlanırsa, 'çocukları tarafından SIGHUPped olacak çıkış / Çıkış yapıldığında; eğer ayarlanmazsa, 'çocukları tarafından SIGHUPped olmayacak çıkış / Çıkış yapıldığında;bashsshhuponexitbashbashhuponexitbashbash

Bu nedenle, genel olarak etkileşimli bir oturum açma bashörneğinden çıkmak / oturumu kapatmak , huponexitseçenek ayarlanmadığı sürece, kabuk SIGHUP'u çocuk yapmaz ve etkileşimli oturum açma dışı bir durumdan çıkmak / oturumu kapatmak bashkabuk SIGHUP'u çocuk yapmaz. ne olursa olsun;

Bununla birlikte, bu, bu durumda ilgisizdir: kullanım kill -9 sleep, ne olursa olsun, ana sürecini ( bash) öldürmek , ikincisinin öncekine bir şey yapma şansı bırakmayacaktır (örneğin, mevcut bashörnek bir giriş bashörneği ise ve huponexitseçenek SIGHUP olarak ayarlandı).

Buna ek olarak, diğer sinyallerin aksine (gönderilen bir SIGHUP sinyali gibi bash), bir SIGKILL sinyali asla bir sürecin alt süreçlerine yayılmaz, dolayısıyla sleepöldürülmez;

nohupfarklı bir şey olan SIGHUP sinyallerine bağışık bir süreç başlatır; bir SIGHUP sinyalinin alınmasının ardından bashbu huponexitseçeneğin ayarlanması ve kabuğun çıkması durumunda etkileşimli oturum açma örneği tarafından alınabilecek sürecin askıya alınmasını önler ; bu nedenle teknik olarak, unset seçeneğiyle nohupetkileşimli bir oturum açma bashörneğinde bir işlemi başlatmak, işlemin huponexitbir SIGHUP sinyalinin alınması üzerine takılmasını önler, ancak kabuktan çıkıp / oturumu kapatmak, ne olursa olsun SIGHUP yapmayacaktır;

Bununla birlikte, genel olarak, nohupana kabuktan SIGHUP sinyallerinin gelmesini önlemek için gerekli olduğunda , kill -9ana yöntemi nohupon alt yöntemine tercih etmek için hiçbir neden yoktur ; bunun yerine tam tersi olmalıdır.

Ebeveynin kill -9yöntemi kullanarak öldürülmesi, ebeveynin zarif bir şekilde çıkması için bir şans bırakmazken, nohupyöntemi kullanarak çocuğa başlamak , ebeveynin SIGHUP (bağlamda mantıklı bir örnek yapmak) gibi diğer sinyallerle sonlandırılmasına izin verir. Kullanmaya başladı nohup).


Başka bir deyişle, arka planda yerleştirilmiş bir komut dosyam varsa, ana işlemi öldürsem bile çalışmaya devam eder, örneğin kabuğum doğru mu? bu senaryoyu öldürmenin bir yolu ne olurdu?
Sergiy Kolodyazhnyy

@Serg PID'niz varsa, PID'yi öldürmeniz yeterlidir; PID'yi saklamadıysanız ancak işlemi adıyla tanımlayabiliyorsanız, süreçleri ps -e | grep processPID ile birlikte listelemelisiniz (veya yalnızca pgrep -x processbu tek işlemle eşleştiğinden emin değilseniz daha iyi olabilir); sorun şu ki kill -9, çocukları sahip olunan bir süreci öldürdüğünüzde upstart, orijinal PPID'leri kaybolur ve PPID'leri uptart'ın PID'sinde değişir, bu da onları tanınmaz hale getirir (AFAIK), ancak adları veya PID için
kos

@kos Hangi koşul altında nohup, bir işlemin ana işlemden bir SIGHUP sinyali aldıktan sonra takılmasını önlemek için başarısız olur? Tarafından (PuTTY SSH kabuk terminalinde) tarafından bir süreç çalıştırmak çalışıyorum nohup <command> <arg> &. PuTTY Xdüğmesine tıklayarak oturumu kapattığımda , arka plan işlemi hemen sona erecek. exitPuTTY SSH kabuk terminalini yazarak oturumu kapattığımda , işlem arka planda çalışmaya devam edecek.
userpal

3

bashvarsayılan olarak , çıkış sırasında HUP sinyalini alt süreçlere göndermez . Daha ayrıntılı olarak (teşekkürler @kos), giriş yapmayan mermiler için asla yapmaz .

Seçeneği ayarladıysanız bash'ı giriş kabukları için yapacak şekilde yapılandırabilirsiniz huponexit. Bir terminalde şunları yapın:

[romano:~] % bash -l

(bu yeni bir "giriş" kabuğu başlatır)

romano@pern:~$ shopt -s huponexit
romano@pern:~$ sleep 1234 &
[1] 32202
romano@pern:~$ exit
logout

Şimdi sleepişlemi kontrol edin :

[romano:~] % ps augx | grep sleep
romano   32231  0.0  0.0  16000  2408 pts/11   S+   15:23   0:00 grep sleep

... çalışmıyor: HUP sinyalini aldı ve istendiği gibi çıkıldı.


@kos --- evet, ... yani neden ben eğer doğru ama hayatta kalır? Uyarı Ben eğer o süreci olacaktır çıkın. Ve ayarlanmış olsa bile hayatta kalır. Şaşkın ... (Daha iyi anlamaya ve asnwer'ı değiştirmeye çalışacağım, aksi takdirde silerim). sleep 1000 & ; exitsleepkill -HUPsleephuponexitsleep
Rmano

2

Eğer sleepbu şekilde hayatta kalabilirse, bu nohupkomut yerine bu yöntemi kullanabileceğim anlamına gelirse ?

kill -9gerçekten gitmesi gereken bir yol değil. TV'yi kapatmak için silahla ateş etmek gibi. Komedi bileşeninin yanı sıra hiçbir avantajı yoktur. İşlemler yakalayamaz veya yok sayamaz SIGKILL. Sürece, işini bitirme ve temizleme şansı vermezseniz, bozuk dosyaları (veya başka bir durumu) bırakabilir ve yeniden başlatılamayabilir. kill -9başka bir şey çalışmadığında son umuttur.


Oturumu kapattığımda ve terminal kapalıyken uyku işlemi neden devam edebilir. Aklımda, oturum kapatma sırasında daemon ve nohup programı hariç her şey öldürülecek.

Senin durumunda ne olur:

Öğesinin üst işlemi sleepşu anda çalışan bashkabuktur. Bu kill -9bash'ı yaptığınızda, bash sürecinin SIGHUPalt süreçlerinden herhangi birine bir gönderme şansı yoktur , çünkü SIGKILL(tarafından gönderilen kill -9) süreç tarafından seçilemez. Uyku işlemi devam ediyor. uyku artık yetim bir süreç haline geldi .

İnit (PID 1) işlemi, yeniden oluşturma adı verilen bir mekanizma yapar. Bu, başlatma işleminin artık bu yetim sürecin üstü olduğu anlamına gelir. init bir istisnadır, süreçler orijinal ana süreçlerini kaybeden süreçleri topladığı için çocuk olabilir. Btw: sshd"Arka plana giderken" bunu bir cini yapar.

Bu olmazsa, yetim kalan süreç daha sonra (bittiğinde) bir zombi süreci haline gelir. Bu waitpid()çağrılmadığında gerçekleşir (bu süreç öldürüldüğünde yerine getirilemeyen ana sürecin sorumluluğu). init waitpid(), zombi çocuklarından kaçınmak için belirli bir aralıkta çağrı yapar .


Süreç, TERMveya gibi kibar sinyallerle bile hayatta HUP
kalıyor

@heemayl HUP kabukları yapılandırmasına bağlıdır: huponext. TERM, uyku bitene kadar bekleyecek. OP'ler uyku komutu durumunda, binlerce yıl =)
kaos

1

&Arka planda işlemini başlatır. Eğer yazarsanız ps -ef, size uyku o üst süreç kimliği (PPID) sizin bash olduğunu göreceksiniz. Ardından oturumu kapatın ve tekrar oturum açın. Çıkış yaptıktan sonra işlem çalışmaya devam edecektir. İkinci kez giriş yaptıktan sonra ps -eftekrar koşarsınız . Artık uyku işleminizin ebeveyninin "1" kimliğine sahip işlem olacağını göreceksiniz. Bu init, tüm süreçlerin ebeveyni.


0

Kullanılması &, programın arka plan olarak çalışmasına neden olur. Programı arka planda görmek için bgkomut kullanın ve yeniden ön plan olarak çalışmasını sağlamak için çalıştırın fg.

Evet, ana terminalden çıkılsa bile programı çalıştırmanın birçok yolu vardır.


Teşekkürler. bash'ın adam sayfası biraz kafa karıştırıcı. Dedi ki: "Çıkmadan önce, etkileşimli bir kabuk SIGHUP'u çalışan veya durdurulan tüm işlere yeniden gönderir." ANCAK aslında kabuk SIGHUP'u ön işlere gönderir . arka plan işlemlerinin SIGHUP sinyalini alma şansı yoktur ('huponexit' kabuk seçeneklerini değiştirmedikçe)
tom_cat

@kos belki haklısın. Bu sonuca yukarıdaki sonucu çiziyorum: stackoverflow.com/questions/4298741/… şimdi, kendimi daha karışık hale getiriyorum.
tom_cat

Kabuk hangi bir dava basitçe var: Buna Geri @tom_cat yine iki kez düşünmeye çıkın bir ön plan süreci, bu SIGHUPped falan olabilir çalışan, ama bu değil çıkarken . Bu doğru, sadece arka plan süreçleri için geçerlidir, çünkü tersi mantıklı olmaz. Ancak daha fazla araştırmadan, akıl da huponexitsadece üzerinden elde edilen bir kabuk gibi giriş kabukları üzerinde çalışır ssh(değil, elde edilen bir kabukta değil gnome-terminal)
kos
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.