killall tidak membunuh semua dan jarang membunuh, untuk apa perintah itu?

12

Saya kadang-kadang menggunakan killallperintah untuk mematikan proses. Alasan mengapa saya katakan secara tidak langsung adalah bahwa dalam beberapa kasus itu tidak berhasil untuk saya.

Contoh terbaru adalah dengan thunderbird di mana ada sekitar 5 instance dalam memori jadi saya memutuskan untuk menggunakan killallperintah. Itu menewaskan 2 proses dan 3 masih tersisa di memori. Mencoba lagi dan ketiganya masih di sana.

Jadi saya secara manual menggunakan kill -9perintah untuk membunuh masing-masing proses melalui pids mereka. Itu berhasil.

Saya lebih sering menggunakan kill -9perintah karena berfungsi. The killallperintah memiliki mengecewakan saya begitu banyak kali aku hanya tidak mengganggu menggunakannya. Tetapi pasti ada alasan mengapa itu tidak berhasil. Apakah saya salah menggunakannya?

Saya tahu ada perintah lain seperti pkilltetapi saya akan berterima kasih untuk memahami mengapa killallperintah itu tidak berfungsi seperti yang diharapkan. Saya bahkan telah mencoba untuk membunuh hanya satu proses dan itu adalah hit and miss affair. Tetapi kill -9perintah itu bekerja setiap saat.

Ada ide?

PS: sudotidak ada bedanya

Meer Borg
sumber

Jawaban:

22

Dari halaman manual untuk killall

killall mengirimkan sinyal ke semua proses yang menjalankan perintah yang ditentukan. Jika tidak ada nama sinyal yang ditentukan, SIGTERM dikirim.

Ketika Anda melakukan kill -9, Anda mengirim sinyal SIGKILL. Jika Anda ingin mengirim SIGKILL dengan killall, Anda harus melakukannya

killall -s SIGKILL <PROCESSNAME>

Penjelasan yang baik tentang perbedaan antara SIGKILL dan SIGTERM (dan mengapa Anda harus mencoba SIGTERM terlebih dahulu)

Dari http://rackerhacker.com/2010/03/18/sigterm-vs-sigkill/

Mengirim sinyal ke proses menggunakan kill pada sistem Unix bukan topik baru untuk sebagian besar administrator sistem, tapi saya telah ditanya berkali-kali tentang perbedaan antara kill dan kill -9.

Setiap kali Anda menggunakan kill pada suatu proses, Anda sebenarnya mengirimkan sinyal proses (dalam hampir semua situasi - saya akan segera membahasnya). Aplikasi C standar memiliki file header yang berisi langkah-langkah yang harus diikuti oleh proses jika menerima sinyal tertentu. Anda bisa mendapatkan seluruh daftar sinyal yang tersedia di sistem Anda dengan memeriksa halaman manual untuk mematikan.

Pertimbangkan perintah seperti ini:

kill 2563

Ini akan mengirim sinyal yang disebut SIGTERM ke proses. Setelah proses menerima pemberitahuan, beberapa hal dapat terjadi:

  • proses dapat segera berhenti
  • proses dapat berhenti setelah penundaan singkat setelah membersihkan sumber daya
  • proses mungkin terus berjalan tanpa batas

Aplikasi dapat menentukan apa yang ingin dilakukan setelah SIGTERM diterima. Sementara sebagian besar aplikasi akan membersihkan sumber daya mereka dan berhenti, beberapa mungkin tidak. Aplikasi dapat dikonfigurasikan untuk melakukan sesuatu yang sama sekali berbeda ketika SIGTERM diterima. Juga, jika aplikasi dalam keadaan buruk, seperti menunggu disk I / O, itu mungkin tidak dapat bekerja pada sinyal yang dikirim.

Sebagian besar administrator sistem biasanya akan menggunakan sinyal yang lebih tiba-tiba ketika aplikasi tidak menanggapi SIGTERM:

kill -9 2563

-9 memberitahu perintah kill yang ingin Anda kirim sinyal # 9, yang disebut SIGKILL. Dengan nama seperti itu, jelas bahwa sinyal ini membawa sedikit lebih berat.

Meskipun SIGKILL didefinisikan dalam file header sinyal yang sama dengan SIGTERM, itu tidak dapat diabaikan oleh proses. Bahkan, prosesnya bahkan tidak mengetahui sinyal SIGKILL karena sinyal langsung menuju ke kernel init. Pada saat itu, init akan menghentikan proses. Proses tidak pernah mendapat kesempatan untuk menangkap sinyal dan menindaklanjutinya.

Namun, kernel mungkin tidak berhasil mematikan proses dalam beberapa situasi. Jika proses menunggu I / O jaringan atau disk, kernel tidak akan dapat menghentikannya. Proses dan proses zombie yang tertidur lelap tanpa gangguan juga tidak bisa dihentikan oleh kernel. Reboot diperlukan untuk menghapus proses-proses tersebut dari sistem.

Ketika Anda mengirim killall (SIGTERM) ke proses thunderbird, Anda meminta proses tersebut untuk berhenti. Beberapa proses tersebut tidak berfungsi dengan benar (mungkin mengapa Anda harus membunuhnya sejak awal), sehingga mereka tidak dapat bertindak berdasarkan sinyal SIGTERM.

tgm4883
sumber
Adakah spekulasi tentang mengapa itu hanya membunuh beberapa contoh thunderbird?
Meer Borg
@Doogfar Lihat tulisan saya yang sudah diedit (atau halaman yang saya
tautkan
Terima kasih, juga menjelaskan mengapa Thunderbird saya rusak, kill -9 terlalu keras
Meer Borg
Masih tidak berfungsi selalu.
Craig Hicks
4

killallmenerima sebagian besar sintaks yang sama dengan kill. Secara khusus, tidak perlu menulis sesuatu yang mewah untuk melakukan killallhal yang setara kill -9. Ini berfungsi dengan baik:

killall -9 thunderbird

(Tentu saja, seperti yang dibahas, Anda biasanya harus enggan untuk menggunakan killall -9atau, dengan kata lain killall -KILL, kecuali tindakan lain telah dicoba tanpa keberhasilan.)

Eliah Kagan
sumber
Masih tidak berfungsi selalu jadi pasti ada sesuatu yang lain.
Craig Hicks