Bagaimana cara mengakhiri semua proses dengan nama yang sama dengan cara yang lebih lembut daripada killall
tidak? Saya tidak ingin mengganggu prosesnya, tetapi biarkan waktu untuk berhenti dengan benar.
Lihat juga:
Bagaimana cara saya membunuh proses di Ubuntu?
Di monitor Sistem, apa perbedaan antara Kill Process dan End Process?
command-line
process
kill
killall
gila tentang natty
sumber
sumber
Jawaban:
1. `killall` sudah bagus (SIGTERM)
killall
secara default mengirimSIGTERM
. Ini sudah merupakan pendekatan yang bagus yang membuat aplikasi memiliki kesempatan untuk membersihkan diri mereka sendiri. "Sudah mati, sekarang!" Pendekatannya adalah mengirimSIGKILL
sinyal, yang mengharuskan Anda menentukannya sebagai opsikillall
. Dari Perpustakaan GNU C: Sinyal Pengakhiran :2. "Proses akhir" Monitor Sistem sama bagusnya (SIGTERM, juga)
Anda menautkan ke pertanyaan tentang Monitor Sistem GNOME. Itu memang digunakan
SIGTERM
untuk tindakan "Proses akhir" juga (dan saya sadar saya menentang jawaban untuk pertanyaan itu). Anda dapat menemukannya di kode sumber untuk memverifikasi diri sendiri:data / menus.ui :
15 di sini adalah nomor sinyal. Sinyal 15 adalah
SIGTERM
. Dan System Monitor telah digunakan denganSIGTERM
baik sebelum pertanyaan lain diajukan dan dijawab.Tambahan teknis (sebagai tanggapan terhadap komentar)
Melihat melalui representasi Github
git blame
, berikut adalah perubahan yang telah dilakukan terhadap bagaimana sinyal-sinyal tersebut dijabarkan dalam kode sumber dari GNOME System Monitor:383007f2 24 Jul 2013 Diganti kode duplikat untuk mengirim sinyal dengan parameter
GAction 0e766b2d 18 Jul 2013 Menu popup proses port ke GAction
97674c79 3 Okt 2012 Singkirkan struktur
ProcData 38c5296c 3 Jul 2011 Buat lekukan seragam di seluruh file sumber.
Tak satu pun dari ini berubah dari
SIGQUIT
menjadiSIGTERM
, dan yang terakhir adalah dari sebelum pertanyaan terkait diajukan.sumber
15
? Itu mungkin telah diubah di beberapa titik sehingga jawaban yang lama bisa 100% benar sehubungan dengan versi yang lama.git grep 'SIGQUIT'
tidak mengungkapkan apa pun. Tidak ada yang terkait dengan sinyal yang ditemukan untukgit grep '>3<'
keduanya. Saya menyimpulkan bahwa gnome-system-monitor kemungkinan besar tidak pernah digunakanSIGQUIT
.git grep
hanya mencari pohon saat ini, bukan seluruh riwayat. Saya menggunakangit blame
(sebenarnya setara dengan Github) untuk menggali sedikit lebih dalam, tapi tetap tidak ada.Jawaban oleh @hvd pada dasarnya benar. Untuk mendukung hal itu lebih jauh lagi,
init
proses akan mengirimSIGTERM
ke proses saat Anda mematikan komputer Anda, kemudian setelah penundaan akan mengirimSIGKILL
jika mereka belum keluar. Proses tidak dapat menangani / mengabaikanSIGKILL
.Untuk memberikan sedikit lebih detail, jawaban sebenarnya adalah bahwa Anda tidak memiliki cara untuk mengetahui dengan pasti bahwa program menanganinya.
SIGTERM
adalah sinyal yang paling umum digunakan untuk sopan meminta suatu program untuk berhenti, tetapi semua penanganan sinyal tergantung pada program melakukan sesuatu dengan sinyal.Dengan kata lain, berdasarkan jawaban yang lain, jika Anda memiliki program yang ditulis oleh @ Jo atau oleh @AlexGreg maka mereka mungkin akan menangani
SIGQUIT
tetapi mungkin tidakSIGTERM
, dan karenanya mengirimSIGTERM
akan menjadi kurang "lunak" daripadaSIGQUIT
.Saya telah menulis beberapa kode sehingga Anda dapat bermain-main dengannya sendiri. Simpan di bawah ini sebagai
signal-test.c
, lalu kompilasi denganAnda kemudian dapat menjalankannya
./signal-test
, dan melihat apa yang terjadi ketika Anda mengirim sinyal yang berbeda dengannyakillall -s <signal>
.Seperti berdiri, kode menangani SIGTERM dan SIGQUIT dengan anggun. Anda dapat mencoba mengomentari garis
signal(SIG...
(menggunakan a//
di awal baris) untuk menghapus penangan sinyal, kemudian jalankan dan mengirim sinyal lagi. Anda harus dapat melihat output yang berbeda ini:tergantung pada apakah Anda menangani sinyal atau tidak.
Anda juga dapat mencoba mengabaikan sinyal:
Jika Anda melakukannya maka pengiriman
SIGTERM
tidak akan melakukan apa pun, Anda harus menggunakannyaSIGKILL
untuk mengakhiri proses.Lebih detail di
man 7 signal
. Perhatikan bahwa menggunakansignal()
cara ini dianggap non-portabel - jauh lebih mudah daripada alternatifnya!Satu catatan kaki kecil lainnya - tentang Solaris
killall
mencoba untuk membunuh semua proses. Mereka semua. Jika Anda menjalankannya sebagai root maka Anda mungkin akan terkejut :)sumber
pkill
. Alasan lainnya adalah pasangan itu berpasanganpgrep
, yang membuatnya lebih mudah untuk memeriksa dengan tepat proses apa yang akan dimatikan, dan yang mana yang memiliki semantik pencocokan yang lebih baik daripadaps | grep
."Akhiri semua" adalah
killall -s SIGQUIT [process name]
. Jika Anda menginginkan solusi yang bagus, tentukanalias endall='killall -s SIGQUIT'
.sumber
SIGQUIT
seperti membuat prosesabort(3)
: itu membuang inti dan kemudian membunuh proses. Ini sama sekali tidak lebih baik / lebih lembut / ramah daripadaSIGTERM
yang default untukkillall
.SIGQUIT
(atau bahkan lebih baik,SIGINT
) mungkin diperlakukan lebih 'lembut' daripadaSIGTERM
, tetapi ini tergantung pada aplikasi. Tidak tertangani, salah satu dari mereka menyebabkan penghentian segera.