Neden bir SIGTEROP işlemiyle bir SIGTERM'i öldüremiyorum ve bekleyen sinyal nerede saklanıyor?


24

Debian stretch (systemd) kullanıyorum. Rsyslog arka planını kullanarak ön planda çalıştırıyordum /usr/sbin/rsyslogd -n ve durdurmak için bir Ctrl+ yaptım Z. İşlemin durumu Tl(durdu, dişli) olarak değişti . Birden fazla verilen yönteme komutları ve işlemin durumu aynıydı: . Bir kez yaptım , öldü. 3 sorum var.kill -15 <pid>Tlfg

  • SIGSTOP-Ed süreci neden yanıt vermiyordu SIGTERM? Çekirdek neden aynı durumda kalıyor?
  • SIGCONTSinyali aldığı anda neden öldürüldü ?
  • Önceki SIGTERMsinyal yüzünden olsaydı , süreç devam edene kadar nerede tutuldu?

Yanıtlar:


41

SIGSTOPve SIGKILLbir işlem tarafından yakalanıp kullanılamayan iki sinyaldir. SIGTSTPgibi SIGSTOPo hariç olabilir yakalanarak ele alınması.

SIGSTOPVe SIGTSTPsinyaller hazır, onun parça bir süreci durdurmak SIGCONT. Bu işlemi a gönderdiğinizde, işlem SIGTERMçalışmıyor ve bu nedenle çıkmak için kodu çalıştıramaz.

(Orada da SIGTTINve SIGTTOUbir arka plana iş çalışır terminaline okuma veya yazma ne zaman TTY katmanı tarafından oluşturulan sinyaller hangi. Bunlar takılabilir ama aksi durağı (askıya alacaktır) süreci, tıpkı SIGTSTP. Ama şimdi gidiyorum bu cevabın geri kalanında bu ikisini yok saymak.)

Sizin CtrlZsüreç a gönderir SIGTSTPtarafından herhangi bir şekilde özel olarak ele alınması olmadığı görülüyor, rsyslogdbu yüzden sadece bekleyen sürecini askıya alır SIGCONTveya SIGKILL.

Buradaki çözüm ayrıca işlemin sinyali alabilmesi ve işlemesi için SIGCONTsizden sonra göndermektir SIGTERM.

Örnek:

sleep 999 &

# Assume we got PID 456 for this process
kill -TSTP 456    # Suspend the process (nicely)
kill -TERM 456    # Terminate the process (nicely). Nothing happens
kill -CONT 456    # Continue the process so it can exit cleanly

GNU C Kütüphanesi'nin dokümantasyonu bunu oldukça iyi açıklıyor, bence (vurgularım):

Bir işlem durdurulurken,SIGKILL sinyaller ve (açıkça) SIGCONTsinyaller dışında , devam edene kadar kendisine başka sinyal iletilemez . Sinyaller beklemede olarak işaretlenir, ancak işlem devam edene kadar iletilmez. Sinyal her zaman sürecin sonlandırılmasını neden olur ve bloke ele veya göz ardı edilemez. Görmezden gelebilirsiniz , ancak durdurulursa işlemin yine de devam etmesine neden olur. Bir işleme bir sinyal gönderme , o işlem için bekleyen tüm durma sinyallerinin atılmasına neden olur. Aynı şekilde, bir işlem için beklemedeki sinyaller bir durma sinyali aldığında atılırSIGKILLSIGCONTSIGCONTSIGCONT


1
@nohup. cevap genişledi, fakat esasen, "evet; kill -15çoktan yolladığınız yoldaydı"
roaima

2
@ nohup evet, belgelere göre: « Bir işlem durdurulurken, devam edilinceye daha fazla sinyal iletilemez ... Sinyaller beklemede olarak işaretlenir, ancak işlem devam edene kadar iletilmez. »
roaima

1
Ayrıca bkz. Süreçleri durduran SIGTTIN ve
SIGTTOU

1
@ StéphaneChazelas iyi bir nokta. Bunlardan bahsettim ama başka türlü görmezden geldim. Lütfen uygun gördüğünüz şekilde düzenleme yapmaktan çekinmeyin.
roaima

2
@coteyr. Kabul etmiyorum: SIGKILLbir uygulamanın temizlenmesini önlediğinden SIGTERM, çoğu (çoğu) durumda kullanılması tercih edilir.
roaima

9

SIGTERMtıpkı diğer gibidir sinyali ki o takılabilir bir işlemle. Sinyalin alınması işlemi sadece özel bir sinyal işlemcisi rutine atlatır. İçin SIGTERMvarsayılan işlem sürecini sonlandırmak için olabilir, ama örneğin edecek bir editör o ölmeden önce herhangi bir açık dosyaların bir taslak kopyasını kaydetmek böylece sinyali yakalamak isteyebilirsiniz. İşlem durdurulursa, sinyal işlemcisini çalıştıramaz, ancak işlem devam edene kadar sinyal beklemede kalacaktır. Not sayı gönderilen sinyallerin genellikle kaydedilmez.

Teoride, sistem, işlem için kurulmuş bir sinyal işleyicinin olup olmadığını bilir SIGTERMve değilse derhal sonlandırır. Ancak (Gilles'un yorumuna göre) POSIX, işlemin devam edene kadar sinyalin beklemesini talep eder SIGCONT.


4
Özür dilerim, önceki yorumum yanlıştı. Bir işlem durdurulurken, SIGKILL ve SIGCONT dışında hiçbir sinyal iletilmez. Sinyalin işlemi öldürmek için varsayılan eylemi olsa bile, bu işlem SIGCONT tarafından sürdürülene kadar ertelenir. POSIX bu davranışı zorunlu kılar.
Gilles 'SO- kötülük olmayı bırak'
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.