Jawaban Singkat : Kirim SIGTERM
, 30 detik kemudian SIGKILL
,. Yaitu, kirim SIGTERM
, tunggu sebentar (mungkin berbeda dari satu program ke program lainnya, Anda mungkin lebih mengenal sistem Anda, tetapi 5 hingga 30 detik sudah cukup. Saat mematikan mesin, Anda mungkin melihatnya secara otomatis menunggu hingga 1'30-an. Kenapa terburu-buru?), Lalu kirim SIGKILL
.
Wajar Jawaban : SIGTERM
, SIGINT
, SIGKILL
ini lebih dari cukup. Prosesnya kemungkinan besar akan berakhir sebelumnya SIGKILL
.
Panjang Jawaban : SIGTERM
, SIGINT
, SIGQUIT
, SIGABRT
,SIGKILL
Ini tidak perlu, tetapi setidaknya Anda tidak menyesatkan proses terkait pesan Anda. Semua sinyal-sinyal yang berarti Anda ingin proses untuk menghentikan apa yang dilakukannya dan keluar.
Apa pun jawaban yang Anda pilih dari penjelasan ini, ingatlah itu!
Jika Anda mengirim sinyal yang berarti sesuatu yang lain, prosesnya mungkin menanganinya dengan cara yang sangat berbeda (di satu sisi). Di sisi lain, jika proses tidak menangani sinyal, tidak peduli apa yang Anda kirim, proses akan tetap berhenti (ketika tindakan default adalah untuk menghentikan, tentu saja).
Jadi, Anda harus berpikir sebagai diri Anda sendiri sebagai seorang programmer. Apakah Anda akan membuat kode penangan fungsi untuk, katakanlah, SIGHUP
untuk keluar dari program yang terhubung dengan sesuatu, atau apakah Anda akan mengulanginya untuk mencoba menghubungkan lagi? Itulah pertanyaan utama di sini! Itulah mengapa penting untuk hanya mengirimkan sinyal yang sesuai dengan keinginan Anda.
Jawaban Panjang yang Hampir Bodoh :
Tabel di bawah ini berisi sinyal yang relevan, dan tindakan default jika program tidak menanganinya.
Saya memesannya dalam urutan yang saya sarankan untuk digunakan (BTW, saya sarankan Anda untuk menggunakan jawaban yang masuk akal , bukan yang ini di sini), jika Anda benar-benar perlu mencoba semuanya (akan menyenangkan untuk mengatakan tabel dipesan dalam hal kehancuran yang mungkin mereka sebabkan, tetapi itu tidak sepenuhnya benar).
Sinyal dengan tanda bintang (*) TIDAK disarankan. Hal penting tentang ini adalah Anda mungkin tidak pernah tahu apa yang diprogram untuk dilakukan. Khususnya SIGUSR
! Ini mungkin memulai kiamat (itu adalah sinyal gratis bagi programmer untuk melakukan apa pun yang dia inginkan!). Tapi, jika tidak ditangani ATAU dalam kasus yang tidak mungkin ditangani untuk dihentikan, program akan berhenti.
Dalam tabel, sinyal dengan opsi default untuk menghentikan dan menghasilkan core dump ditinggalkan pada akhirnya, tepat sebelumnya 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
Maka saya akan menyarankan untuk ini jawaban yang panjang hampir bodoh :
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGQUIT
, SIGABRT
,SIGKILL
Dan akhirnya, file
Jawaban Panjang yang Pasti Bodoh :
Jangan coba ini di rumah.
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGALRM
, SIGUSR2
, SIGUSR1
, SIGQUIT
, SIGABRT
, SIGSEGV
, SIGILL
, SIGFPE
Dan jika tidak ada yang berhasil, SIGKILL
.
SIGUSR2
harus dicoba sebelumnya SIGUSR1
karena kita lebih baik jika program tidak menangani sinyalnya. Dan lebih mungkin untuk menangani SIGUSR1
jika menangani hanya salah satu dari mereka.
BTW, the KILL : tidak salah mengirim SIGKILL
ke suatu proses, seperti jawaban lain yang dinyatakan. Nah, pikirkan apa yang terjadi ketika Anda mengirim shutdown
perintah? Ini akan mencoba SIGTERM
dan SIGKILL
hanya. Menurut Anda mengapa demikian? Dan mengapa Anda membutuhkan sinyal lain, jika shutdown
perintah itu hanya menggunakan dua sinyal ini?
Sekarang, kembali ke jawaban panjang , ini adalah satu kalimat yang bagus:
for SIG in 15 2 3 6 9 ; do echo $SIG ; echo kill -$SIG $PID || break ; sleep 30 ; done
Ia tidur selama 30 detik di antara sinyal. Mengapa lagi Anda membutuhkan oneliner ? ;)
Juga, disarankan: coba hanya dengan sinyal 15 2 9
dari jawaban yang masuk akal .
keamanan : lepaskan detik echo
saat Anda siap untuk pergi. Saya menyebutnya milik saya dry-run
untuk onliner . Selalu gunakan untuk menguji.
Script membunuh
Sebenarnya saya sangat tertarik dengan pertanyaan ini sehingga saya memutuskan untuk membuat skrip kecil untuk melakukan hal itu. Silakan, silakan unduh (klon) di sini:
Tautan GitHub ke repositori Killgracefully