Kapan saya seharusnya tidak membunuh proses -9?

401

Saya selalu sangat ragu untuk berlari kill -9, tetapi saya melihat admin lain melakukannya hampir secara rutin.

Saya pikir mungkin ada jalan tengah yang masuk akal, jadi:

  1. Kapan dan mengapa harus kill -9digunakan? Kapan dan mengapa tidak?
  2. Apa yang harus dicoba sebelum melakukannya?
  3. Jenis proses debug "hung" apa yang bisa menyebabkan masalah lebih lanjut?
Mikel
sumber
7
Jawaban SO terkait yang bagus .
jw013

Jawaban:

362

Secara umum, Anda harus menggunakan kill(kependekan dari kill -s TERM, atau pada sebagian besar sistem kill -15) sebelum kill -9( kill -s KILL) untuk memberikan proses target kesempatan untuk membersihkan setelahnya. (Proses tidak dapat menangkap atau mengabaikan SIGKILL, tetapi mereka dapat dan sering menangkap SIGTERM.) Jika Anda tidak memberikan proses kesempatan untuk menyelesaikan apa yang dilakukan dan dibersihkan, mungkin meninggalkan file yang rusak (atau negara bagian lain) di sekitarnya. tidak akan dapat mengerti setelah dimulai ulang.

strace/ truss, ltracedan gdbumumnya ide bagus untuk melihat mengapa proses macet macet. ( truss -upada Solaris sangat membantu; Saya menemukan ltraceterlalu sering menyajikan argumen untuk panggilan perpustakaan dalam format yang tidak dapat digunakan.) Solaris juga memiliki /procalat-alat berbasis berguna , beberapa di antaranya telah porting ke Linux. ( pstacksering membantu).

geekosaurus
sumber
67
alasan kuatnya adalah bahwa jika Anda terbiasa mengirim SIGKILL, maka ketika Anda masuk ke sebuah program yang, misalnya, merusak database penting untuk Anda atau perusahaan Anda, Anda akan benar-benar menyesalinya. kill -9memiliki penggunaannya, sebagai terminator upaya terakhir, penekanan pada upaya terakhir; admin yang menggunakannya sebelum pilihan terakhir a) tidak mengerti menjadi admin dengan baik, dan b) tidak boleh menggunakan sistem produksi.
Arcege
9
@Mikel Hal lain untuk melewatinya, kadang-kadang lebih baik untuk mengelabui aplikasi agar membersihkan dirinya sendiri dengan sinyal seperti SIGQUIT atau SIGSEGV jika tidak merespons SIGINT / SIGTERM. Misalnya, aplikasi 3-D layar penuh atau bahkan Xorg. Dengan menggunakan SIGQUIT, ia tidak akan memiliki kesempatan untuk membersihkan apa pun, tetapi mengelabui dengan berpikir bahwa kesalahan segmen terjadi dan ia akan merasa tidak memiliki pilihan selain membersihkan dan keluar.
penguin359
12
@Arcege Apakah Anda berpikir bahwa menggunakan database yang merusak data jika terbunuh dengan -9 adalah database yang layak digunakan? iirc, mysql, bdb, pg, dll ... semua berperilaku baik ketika dibunuh dengan -9.
dhruvbird
13
killall -9 java ftw
dmourati
23
@ Dhruvbird: hanya karena DB Anda seharusnya dilengkapi dengan rompi anti peluru, tidak berarti Anda harus menembak mereka jika tidak perlu. Meskipun Anda mungkin benar bahwa hal itu tidak berisiko seperti yang dikatakan Arcege, saya pikir maksudnya tetap bahwa itu berisiko dan harus menjadi pilihan terakhir.
iconoclast
228

Randal Schwartz sering memposting "Penggunaan tidak berguna (x)" pada daftar. Salah satu pos tersebut adalah tentang kill -9. Ini termasuk alasan dan resep untuk diikuti. Ini adalah versi yang direkonstruksi (dikutip di bawah).

(Kutipan kekejian)

Tidak tidak Tidak. Jangan gunakan kill -9.

Itu tidak memberi proses kesempatan untuk bersih:

1) mematikan koneksi soket

2) membersihkan file temp

3) beri tahu anak-anaknya bahwa mereka akan pergi

4) mengatur ulang karakteristik terminalnya

dan seterusnya dan seterusnya.

Umumnya, kirim 15, dan tunggu satu atau dua detik, dan jika itu tidak berhasil, kirim 2, dan jika itu tidak berhasil, kirim 1. Jika tidak, HAPUS BINARY karena programnya berperilaku buruk!

Jangan gunakan kill -9. Jangan mengeluarkan pemanen gabungan hanya untuk merapikan pot bunga.

Hanya Penggunaan Usenet yang Tidak Berguna,

(.tanda tangan)

Shawn J. Goff
sumber
12
Tidak akankah sistem operasi menutup deskriptor file terbuka (termasuk soket) ketika proses berakhir?
Brian Gordon
3
Ya, tentu saja. Tapi misalkan Anda membunuh proses server dengan klien yang terhubung, maka klien tidak akan melihat bahwa server hilang sebelum waktu habis.
Björn Lindqvist
45
Ah ya argumen "jika tidak sempurna Anda bodoh menggunakannya".
Timmmm
3
Atau bodoh untuk digunakan jika jika proses yang dimaksud adalah produksi perusahaan Anda
Warren P
3
Jika suatu proses terbunuh maka soket akan mengirim RST ke rekan, di mana seolah-olah proses panggilan menutup atau mematikan pada soket, maka soket mengirimkan FIN. Tidak ada batas waktu yang dibutuhkan. Situasi batas waktu hanya akan terjadi jika daya jatuh atau kabel jaringan dilepas.
ctrl-alt-delor
78

Itu harus selalu OK untuk dilakukan kill -9, sama seperti itu harus selalu OK untuk mematikan dengan menarik kabel daya. Mungkin anti-sosial, dan meninggalkan beberapa pemulihan untuk dilakukan, tetapi itu harus bekerja, dan merupakan alat yang ampuh bagi yang tidak sabar.

Saya mengatakan ini sebagai seseorang yang akan mencoba pembunuhan biasa (15) terlebih dahulu, karena itu memberikan program kesempatan untuk melakukan pembersihan - mungkin hanya menulis ke log "keluar pada sig 15". Tapi saya tidak akan menerima keluhan tentang perilaku buruk pada pembunuhan -9.

Alasannya: banyak pelanggan yang melakukan hal-hal yang lebih disukai programmer daripada tidak. Pengujian random kill -9 adalah skenario pengujian yang baik dan adil, dan jika sistem Anda tidak menanganinya, sistem Anda rusak.

dbrower
sumber
2
Bagaimana Anda menguji "kill -9 acak"? Ketika Anda membunuh -9, Anda selesai dan selesai.
Karel Bílek
18
@ Karel: Anda menguji apakah sistem Anda dapat pulih setelahnya, dan membersihkan semua transaksi yang rusak yang sedang diproses pada saat SIGKILL.
Tadeusz A. Kadłubowski
7
Ini tidak apa-apa untuk melakukan kill -9hal seperti itu tidak baik untuk melepas steker. Meskipun tentu saja ada situasi di mana Anda tidak punya pilihan, ini harus menjadi tindakan terakhir. Tentu saja, menarik kabel daya atau kill -9tidak seharusnya memiliki efek buruk seperti mencegah aplikasi atau OS untuk memulai kembali dengan benar jika sama sekali, tetapi sial terjadi dan menggunakan cara yang disarankan ( kill [-15]) atau shutdown yang teratur akan membantu menghindari kekacauan yang mungkin terjadi jika Anda secara rutin menyela program dan OS dengan cara itu. Dalam kasus apa pun, selalu ada risiko kehilangan data terlepas dari kekokohan kode.
jlliagre
7
Saya menduga apa yang dimaksud Michael dengan 'OK' adalah bahwa program Anda harus menangani situasi ini dengan anggun, dan dapat melakukan beberapa bentuk pembersihan saat restart. Misalnya, membersihkan file PID dan sebagainya, bukan hanya membuang mainannya dari kereta bayi dan menolak untuk memulai.
gerryk
2
@gerryk Mereka memang seharusnya tetapi masalahnya adalah beberapa orang akan menganggap jawaban itu sebagai "lisensi untuk membunuh -9" apa pun situasi dan lingkungannya. Itu adalah sikap yang tidak bertanggung jawab.
jlliagre
39

Saya menggunakan kill -9 dengan cara yang sama seperti saya membuang peralatan dapur di mesin pencuci piring: jika peralatan dapur hancur oleh mesin pencuci piring maka saya tidak menginginkannya.

Hal yang sama berlaku untuk sebagian besar program (bahkan basis data): jika saya tidak dapat membunuh mereka tanpa ada yang rusak, saya tidak benar-benar ingin menggunakannya. (Dan jika Anda kebetulan menggunakan salah satu dari non-database ini yang mendorong Anda untuk berpura-pura mereka memiliki data yang bertahan ketika mereka belum: well, saya kira sudah saatnya Anda mulai berpikir tentang apa yang Anda lakukan).

Karena di dunia nyata barang bisa turun kapan saja dengan alasan apa pun.

Orang harus menulis perangkat lunak yang toleran terhadap gangguan. Khususnya di server. Anda harus belajar bagaimana merancang perangkat lunak yang mengasumsikan bahwa segala sesuatu akan rusak, macet dll.

Hal yang sama berlaku untuk perangkat lunak desktop. Ketika saya ingin mematikan peramban, biasanya AGES perlu dimatikan. Tidak ada yang perlu dilakukan oleh peramban saya yang membutuhkan waktu paling lama beberapa detik. Ketika saya memintanya untuk mematikannya, ia harus segera melakukannya. Ketika tidak, well, maka kita tarik kill -9 dan berhasil.

borud
sumber
4
Saya setuju bahwa suatu proses harus ditulis agar toleran terhadap kegagalan semacam itu, tetapi saya pikir itu masih merupakan praktik yang buruk untuk melakukan ini. Basis data akan pulih tetapi mungkin mendeteksi abortus kasar dan kemudian memicu pemeriksaan pemulihan yang signifikan saat dimulai ulang. Dan bagaimana dengan permintaan yang dilayani suatu proses? Mereka semua akan terputus secara instan, klien mungkin memiliki bug dan gagal juga?
Daniel James Bryars
3
Basis data yang tidak dapat dibunuh kapan pun bukanlah basis data yang dapat diandalkan. Ini adalah persyaratan yang cukup mendasar jika Anda memerlukan konsistensi. Adapun klien: jika mereka rusak dan merusak data saat koneksi terputus, mereka juga dirancang dengan buruk. Cara untuk mengatasi kehilangan layanan adalah melalui redundansi dan strategi failover / retry otomatis. Biasanya untuk sebagian besar sistem gagal cepat lebih baik daripada mencoba memulihkan.
borud
4
@borud Ini mungkin bukan perangkat lunak yang ditulis dengan sempurna, tetapi perangkat lunak yang digunakan orang sepanjang waktu. Administrator sistem apa yang memiliki kemewahan untuk selalu dapat memilih perangkat lunak yang ditulis dengan sempurna, hingga selalu pulih dengan anggun dari gangguan mendadak? Tidak banyak. Secara pribadi saya menggunakan skrip shutdown, dan memulai / menghentikan proses melalui ini. Jika mereka tidak menanggapi skrip shutdown (yang melakukan pensinyalan yang tepat untuk proses tersebut), saya bunuh -9.
Steve Sether
2
Tidak ada perbedaan antara memasak bahan-bahan dasar dan hidangan yang lebih kompleks sehubungan dengan alat-alatnya. Perbedaannya adalah si juru masak. (Namun, jika Anda menghabiskan banyak waktu memasak seperti saya, Anda menyadari bahwa ketahanan adalah persyaratan minimum dalam peralatan dapur dan bahwa kebanyakan orang yang menjual persediaan dapur kepada konsumen tidak akan mengetahui alat yang buruk dari alat yang hebat.)
borud
1
Jadi Anda mendorong orang untuk menjadi ceroboh karena sulit untuk melakukan sesuatu dengan benar? Semakin banyak perangkat lunak dijalankan dalam lingkungan operasional yang bersifat sementara. Jika Anda menulis perangkat lunak yang rewel jika tidak dimatikan dengan benar, Anda akan kesulitan meyakinkan pengusaha untuk mempekerjakan Anda sebagai pengembang.
borud
10

Tidak disebutkan dalam semua jawaban lain adalah kasus di mana kill -9tidak berfungsi sama sekali, ketika suatu proses adalah <defunct>dan tidak dapat dibunuh:

Bagaimana saya bisa membunuh proses <defunct> yang orang tuanya init?

Apa yang tidak berfungsi untuk suatu proses dan mengapa tidak terbunuh?

Jadi sebelum Anda mencoba untuk kill -9sebuah <defunct>proses berjalan ps -efuntuk melihat apa yang orang tuanya adalah dan mencoba yang -15(JANGKA) atau -2(INT) dan terakhir -9(membunuh) dari orang tuanya.

Catatan: apa ps -effungsinya .

Kemudian edit dan hati-hati: Lanjutkan dengan hati-hati ketika membunuh proses, orang tua mereka atau anak-anak mereka, karena mereka dapat membiarkan file dibuka atau rusak, koneksi yang belum selesai, dapat merusak database dll kecuali jika Anda tahu apa yang kill -9dilakukan untuk suatu proses, gunakan hanya sebagai pilihan terakhir , dan jika Anda perlu menjalankan kill gunakan sinyal yang ditentukan di atas sebelum digunakan-9 (KILL)

Eduard Florinescu
sumber
6

Jangan pernah melakukan kill -9 1. Juga hindari melakukan kill pada proses tertentu seperti mount`. Ketika saya harus membunuh banyak proses (misalnya, sesi X digantung dan saya harus membunuh semua proses pengguna tertentu), saya membalik urutan proses. Sebagai contoh:

ps -ef|remove all processes not matching a certain criteria| awk '{print $2}'|ruby -e '$A=stdin.readlines; A.reverse.each{|a| puts "kill -9 #{a}"}'|bash

Perlu diingat bahwa killtidak menghentikan proses dan melepaskan sumber dayanya. Yang dilakukannya hanyalah mengirim sinyal SIGKILL ke proses; Anda bisa berakhir dengan proses yang menggantung.

HandyGandy
sumber
1
Suara buruknya adalah orang lain. Tetapi sumber daya mana yang tidak dirilis? Apakah maksud Anda proses tidak dapat melakukan pembersihan normal? Bagaimana dengan kunci file, semaphores, dll? Bisakah Anda menguraikan?
Mikel
Sepertinya memori bersama SysV dan semaphores harus dibersihkan, setidaknya. archives.postgresql.org/pgsql-general/2006-10/msg01065.php
Mikel
8
Jawaban ini sebagian membingungkan dan sebagian salah. kill -9 1diabaikan di bawah sebagian besar kesatuan. Tidak perlu untuk menghindari kill -9untuk mount, tetapi tidak ada gunanya itu baik. Saya tidak tahu apa yang Anda maksud dengan "membalik urutan proses". kill -9memang menghentikan (seperti dalam, membunuh) suatu proses, tanpa memberikannya kesempatan untuk mengeluh, namun pembunuhan itu tidak akan terjadi segera jika prosesnya dalam panggilan sistem yang tidak dapat disela . Membunuh suatu proses dengan kill -9memang melepaskan sebagian besar sumber daya, tetapi tidak semua .
Gilles
5

Proses membunuh mau tidak mau bukanlah langkah yang mulus: data bisa hilang, aplikasi yang dirancang dengan buruk dapat memecahkan diri mereka dengan cara yang halus yang tidak dapat diperbaiki tanpa menginstal ulang .. tapi itu sepenuhnya tergantung pada mengetahui apa yang ada dan apa yang tidak aman dalam suatu situasi yang diberikan. dan apa yang akan beresiko. Pengguna harus memiliki gagasan tentang apa proses itu, atau seharusnya, melakukan dan apa kendala itu (disk IOPS, rss / swap) dan dapat memperkirakan berapa lama waktu yang diperlukan untuk proses yang berjalan lama (katakanlah salinan file, reencoding mp3, migrasi email, cadangan, [timesink favorit Anda di sini].)

Lebih jauh, mengirim SIGKILLke pid bukan jaminan untuk membunuhnya. Jika itu terjebak dalam syscall atau sudah zombie ( Zdi ps), mungkin terus zombie. Ini seringkali merupakan kasus proses yang berjalan lama dan lupa bgsebelum mencobanya kill -9. Sederhana fgakan menyambung kembali stdin / stdout dan mungkin membuka blokir proses, biasanya kemudian diikuti oleh proses penghentian. Jika macet di tempat lain atau dalam beberapa bentuk kebuntuan kernel lain, hanya reboot yang dapat menghapus proses. (Proses zombie sudah mati setelah SIGKILLdiproses oleh kernel (tidak ada kode userland lebih lanjut akan berjalan), biasanya ada alasan kernel (mirip dengan "diblokir" menunggu syscall untuk menyelesaikan) untuk proses tidak berakhir.)

Juga, jika Anda ingin membunuh proses dan semua anak-anaknya, biasakan menelepon killdengan PID yang dinegasikan, bukan hanya PID itu sendiri . Tidak ada jaminan SIGHUP, SIGPIPEatau SIGINTsinyal lain membersihkannya, dan memiliki banyak proses pembersihan yang tidak diakui (ingat anjing?) Menyebalkan.

Bonus jahat: kill -9 -1sedikit lebih merusak daripada kill -9 1(Jangan melakukan keduanya sebagai root kecuali Anda ingin melihat apa yang terjadi pada VM yang tidak penting dan tidak penting)

dhchdhd
sumber
3

Mengapa Anda tidak ingin kill -9melakukan proses secara normal

Menurut man 7 signal:

Sinyal SIGKILL dan SIGSTOP tidak dapat ditangkap, diblokir, atau diabaikan.

Ini berarti bahwa aplikasi yang menerima salah satu dari sinyal-sinyal ini tidak dapat "menangkap" mereka untuk melakukan perilaku mematikan.

Apa yang harus Anda lakukan sebelum menjalankan kill -9suatu proses

Anda harus memastikan bahwa sebelum mengirim sinyal ke proses yang Anda:

  1. Pastikan bahwa prosesnya tidak sibuk (mis. Melakukan "pekerjaan"); mengirimkan kill -9ke proses pada dasarnya akan mengakibatkan hilangnya data ini.
  2. Jika prosesnya adalah basis data non-responsif, pastikan ia menghapus cache-nya terlebih dahulu. Beberapa basis data mendukung pengiriman sinyal lain ke proses untuk memaksa pembilasan cache-nya.

sumber
3

Saya telah membuat skrip yang membantu mengotomatiskan masalah ini.

Ini didasarkan pada jawaban lengkap saya 2 dalam pertanyaan yang sangat mirip di stackoverflow .

Anda bisa membaca semua penjelasan di sana. Untuk meringkas saya akan merekomendasikan adil SIGTERMdan SIGKILL, atau bahkan SIGTERM, SIGINTdan SIGKILL. Namun saya memberikan lebih banyak opsi dalam jawaban lengkap.

Silakan, silakan unduh (clone) dari repositori github untuk mematikannya 1

Dr Beco
sumber