Neden nohup arka plan işlemi öldürülüyor?


10

Komut kullanarak arka planda bir işlem başlatan uzak bir oturum ile bir kabuk komut dosyası başlatmayı denedim.

nohup python3 run.py > nohup.out &

Uzak oturum kapatıldığında, işlem şu mesajla öldürülür:

Yakalanan sinyal SIGHUP

SIGHUP yakalandı ama cüretkar değil. Çıkılması.

Anlamıyorum; Neden nohup kullanılarak arka planda başlatıldığında süreç öldürülüyor ?


1
Kabuk iş kontrolünün tüm beklenmedik davranışları ile karıştırılırdım. Şimdi sadece görevi tamamen kullanıyorum tmuxve görmezden geliyorum nohupya da reddetiyorum.
Siyuan Ren

Yanıtlar:


10

Python programınız geri alınır nohup.

nohupile hangup sinyalini yok sayar SIG_IGNve daha sonra zincir aynı programa yükler.

Python programınız , kendi sinyal işleyicisini kurarak kapatma sinyali için sinyal işlemeyi derhal sıfırlar . Bu işleyici, dahili bir işlevi kontrol eder (çok iyi tasarlanmamıştır, eğer gördüğüm, bazı kusurlu varsayımlara dayanarak) ve bir askıya alma sinyali alındığında uygun eylem yolunun bu mesajı yazdırmak olduğuna karar verir. ve çıkın.

Tasarım gereği Python programınız mümkün değildir nohup. Bir iş kontrol kabuğuna ve POSIX oturum / iş semantiğine sahip bir sistemde, işin başında olmanız gerekir, disownböylece kabuğun ilk etapta bir askıya alma sinyali göndermek için bunu hiç bilmemesi gerekir.

(Bu bile systemd işletim sistemlerinde yeterli değildir. Systemd kullanıcıları, kullanıcı alanı oturum açma mekanizmalarından bir parça domuz kulağı yaptıklarından, ayrıca sistemd'in sisteme kapatma yerine sistem kapatma sinyalini veren mekanizmasını da sağlamanız gerekir. her çıkışta oturumlar da devreye girmiyor.)

daha fazla okuma


3
Bunu yapan Python programı mı yoksa sessizce arkalarından yapan Python yorumlayıcısı mı (/ çalışma zamanı ortamı)?
ilkkachu

Ayrıca, Mac OS'de, bir ssh oturumundan çıkış yapmak, kullanmaya başladığınızda bile kabuk işlerinizi öldürür nohup; Bunun için bir çare bulamadık
imhotap

Sorun, sinyal işleyici ise, OP, sinyal işleyiciyi işlemi öldürmeyen bir işleyiciye değiştirebilir. Bu, bu tür sinyal işleyiciyi kimin kurduğundan bağımsız olarak çalışmalıdır. Ssh ile ilgili olarak eklemek istiyorum: bazen, süreç hayatta kalsa bile, sıkıntıları olabilir. Birkaç yıl önce bazı izin hatalarını anlamaya çalışırken biraz zaman kaybettim ve sonunda suçlu Kerberos'du: ssh oturumu kapatıldığında jetonların süresi doldu, bu yüzden bunların yerine kullanılacak yeni jetonlar oluşturmak zorunda kaldım ssh oturumunun.
Bakuriu

@JdeBP Denedim setsid nohup python3 run.py > nohup.out &, setsid bu sorunu çözmüştür. Bu uygun bir yaklaşım mı?
Mostited Mani
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.