Kısa Cevap : Gönder SIGTERM
, 30 saniye sonra SIGKILL
. Yani gönder SIGTERM
, biraz bekle (programdan programa değişebilir, sisteminizi daha iyi tanıyabilirsiniz, ancak 5 ila 30 saniye yeterlidir. Bir makineyi kapatırken otomatik olarak 1'30'lara kadar beklediğini görebilirsiniz. Sonuçta neden acele?), Sonra gönderin SIGKILL
.
Makul Cevap : SIGTERM
, SIGINT
, SIGKILL
Bu yeter de artar. Süreç büyük olasılıkla daha önce sona erecek SIGKILL
.
Uzun Cevap : SIGTERM
, SIGINT
, SIGQUIT
, SIGABRT
,SIGKILL
Bu gereksizdir, ancak en azından mesajınızla ilgili süreci yanıltmıyorsunuz. Bütün bu sinyaller yok sen süreç yaptığını ve çıkış ne durdurmak istiyor demek.
Bu açıklamadan hangi cevabı seçerseniz seçin, bunu aklınızda bulundurun!
Başka bir anlama gelen bir sinyal gönderirseniz, süreç bunu çok farklı şekillerde ele alabilir (bir yandan). Öte yandan, eğer süreç sinyali işlemezse, ne gönderdiğiniz önemli değil, süreç yine de sonlandırılacaktır (tabii ki varsayılan eylem sonlandırmak olduğunda).
Yani, kendinizi bir programcı olarak düşünmelisiniz. Bir SIGHUP
şeye bağlanan bir programdan çıkmak için bir işlev işleyiciyi kodlar mıydınız yoksa tekrar bağlanmayı denemek için onu döngüye mi sokardınız? Buradaki ana soru bu! Bu nedenle, niyet ettiğiniz şeyi ifade eden sinyaller göndermek önemlidir.
Neredeyse Aptalca Uzun Cevap :
Aşağıdaki tablo, ilgili sinyalleri ve programın bunları işlememesi durumunda varsayılan eylemleri içerir.
Kullanmayı önerdiğim sırayla sipariş ettim (BTW, makul cevabı kullanmanızı öneririm , burada değil), gerçekten hepsini denemeniz gerekiyorsa (masanın sıralı olduğunu söylemek eğlenceli olur. neden olabilecekleri yıkım, ancak bu tamamen doğru değil ).
Yıldız (*) ile sinyaller vardır DEĞİL önerilir. Bunlarla ilgili önemli olan şey, ne yapmak için programlandığını asla bilemeyeceğinizdir. Özellikle SIGUSR
! Kıyameti başlatabilir (bir programcı için ne isterse yapması ücretsiz bir işarettir!). Ancak, ele alınmazsa VEYA beklenmedik bir durumda sona erdirilirse, program sona erecektir.
Tabloda, sonlandırmak ve bir çekirdek dökümü oluşturmak için varsayılan seçeneklere sahip sinyaller, hemen öncesinde sonunda bırakılmıştır SIGKILL
.
Signal Value Action Comment
----------------------------------------------------------------------
SIGTERM 15 Term Termination signal
SIGINT 2 Term Famous CONTROL+C interrupt from keyboard
SIGHUP 1 Term Disconnected terminal or parent died
SIGPIPE 13 Term Broken pipe
SIGALRM(*) 14 Term Timer signal from alarm
SIGUSR2(*) 12 Term User-defined signal 2
SIGUSR1(*) 10 Term User-defined signal 1
SIGQUIT 3 Core CONTRL+\ or quit from keyboard
SIGABRT 6 Core Abort signal from abort(3)
SIGSEGV 11 Core Invalid memory reference
SIGILL 4 Core Illegal Instruction
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
Sonra bunun için öneririm neredeyse aptal uzun cevap :
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGQUIT
, SIGABRT
,SIGKILL
Ve son olarak
Kesinlikle Aptal Uzun Uzun Cevap :
Bunu evde denemeyin.
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGALRM
, SIGUSR2
, SIGUSR1
, SIGQUIT
, SIGABRT
, SIGSEGV
, SIGILL
, SIGFPE
Ve hiçbir şey, eğer çalıştı SIGKILL
.
SIGUSR2
daha önce denenmeli SIGUSR1
çünkü program sinyali işlemezse daha iyi durumda oluruz. Ve SIGUSR1
bunlardan sadece birini idare etmesi çok daha muhtemeldir .
BTW, KILL : SIGKILL
Diğer yanıtın da belirttiği gibi bir işleme göndermek yanlış değildir . Peki, bir shutdown
emir gönderdiğinizde ne olacağını düşünün ? Bu çalışacağız SIGTERM
ve SIGKILL
sadece. Neden böyle olduğunu düşünüyorsun? Ve eğer shutdown
komut sadece bu ikisini kullanıyorsa , neden başka sinyallere ihtiyacınız var ?
Şimdi, uzun cevaba dönelim , bu güzel bir oneliner:
for SIG in 15 2 3 6 9 ; do echo $SIG ; echo kill -$SIG $PID || break ; sleep 30 ; done
Sinyaller arasında 30 saniye uyur. Başka neden bir oneliner'e ihtiyacınız var ? ;)
Ayrıca, önerilir: yalnızca makul cevaptan15 2 9
gelen sinyallerle deneyin .
güvenlik : echo
gitmeye hazır olduğunuzda ikinciyi kaldırın . Bunu benim çağrı dry-run
için Onliners . Her zaman test etmek için kullanın.
Komut öldürücü bir şekilde
Aslında bu soru o kadar ilgimi çekti ki tam da bunu yapmak için küçük bir senaryo oluşturmaya karar verdim. Lütfen buradan indirin (klonlayın):
Killgracefully deposuna GitHub bağlantısı