it-swarm-id.com

Kapan saya seharusnya tidak membunuh proses -9?

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

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

  1. Kapan dan mengapa harus kill -9 digunakan? Kapan dan mengapa tidak?
  2. Apa yang harus dicoba sebelum melakukannya?
  3. Jenis proses debug "hung" apa yang bisa menyebabkan masalah lebih lanjut?
405
Mikel

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

strace/truss, ltrace dan gdb umumnya adalah ide yang bagus untuk melihat mengapa proses yang macet macet. (truss -u pada Solaris sangat membantu; Saya menemukan ltrace terlalu sering menyajikan argumen untuk panggilan pustaka dalam format yang tidak dapat digunakan.) Solaris juga bermanfaat /proc- alat berbasis, beberapa di antaranya telah porting ke Linux. (pstack sering membantu).

366
geekosaur

Randal Schwartz sering memposting "Penggunaan tidak berguna (x)" pada daftar. Salah satu posting 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)

230
Shawn J. Goff

Harus selalu baik untuk melakukan 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.

77
dbrower

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 kebanyakan 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. Ada tidak ada peramban saya kebutuhan untuk melakukan itu harus lebih dari beberapa detik. Ketika saya memintanya untuk mematikannya, ia harus segera melakukannya. Ketika tidak, well, maka kita tarik kill -9 dan berhasil.

39
borud

Tidak disebutkan dalam semua jawaban lain adalah kasus di mana kill -9 Tidak 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 itu tidak terbunuh?

Jadi sebelum Anda mencoba kill -9 Proses <defunct> Jalankan ps -ef Untuk melihat seperti apa orang tuanya dan coba -15 (TERM) atau -2 (INT) dan terakhir -9 (BUNUH) pada orang tuanya.

Catatan: apa ps -ef .

Kemudian edit dan hati-hati: Lanjutkan dengan hati-hati saat membunuh proses, orang tua mereka atau anak-anak mereka, karena mereka dapat membiarkan file dibuka atau rusak, koneksi yang belum selesai, mungkin rusak basis data dll kecuali Anda tahu apa yang kill -9 lakukan untuk suatu proses, gunakan itu hanya sebagai upaya terakhir, dan jika Anda perlu menjalankan kill gunakan sinyal yang ditentukan di atas sebelum menggunakan -9 (KILL)

10

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

Ingatlah bahwa kill tidak menghentikan proses dan melepaskan sumber dayanya. Yang dilakukannya hanyalah mengirim sinyal SIGKILL ke proses; Anda bisa berakhir dengan proses yang menggantung.

6
HandyGandy

Proses membunuh mau tidak mau bukanlah langkah yang mulus: data bisa hilang, aplikasi yang dirancang buruk dapat merusak diri sendiri 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 SIGKILL ke pid bukan jaminan untuk membunuhnya. Jika macet di syscall atau sudah di-zombi (Z di ps), itu mungkin terus di-zombi. Ini sering terjadi pada ^ Z proses yang berjalan lama dan lupa untuk bg sebelum mencoba kill -9 Itu. fg sederhana akan 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 lainnya, hanya reboot yang dapat menghapus proses. (Proses zombie sudah mati setelah SIGKILL diproses oleh kernel (tidak ada kode userland lebih lanjut yang akan berjalan), biasanya ada alasan kernel (mirip dengan "diblokir" menunggu syscall selesai) untuk proses tidak mengakhiri.)

Juga, jika Anda ingin membunuh suatu proses dan semua anak-anaknya, biasakan memanggil kill dengan PID yang dinegasikan, bukan hanya PID itu sendiri. Tidak ada jaminan SIGHUP, SIGPIPE atau SIGINT atau sinyal lain membersihkannya, dan memiliki banyak proses pembersihan yang tidak diakui (ingat mongrel?) Mengganggu.

Bonus evil: kill -9 -1 sedikit lebih merusak daripada kill -9 1 (Jangan lakukan keduanya sebagai root kecuali Anda ingin melihat apa yang terjadi pada VM yang tidak penting, dibuang-buang)

5
dhchdhd

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 hanya SIGTERM dan SIGKILL, atau bahkan SIGTERM, SIGINT dan SIGKILL. Namun saya memberikan lebih banyak opsi dalam jawaban lengkap.

Silakan, silakan unduh (klon) dari github repositori ke killgracefully1

3
Dr Beco

Kenapa kamu tidak mau kill -9 sebuah proses secara normal

Berdasarkan 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 -9 sedang dalam proses

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

  1. Pastikan bahwa prosesnya tidak sibuk (mis. Melakukan "pekerjaan"); mengirim kill -9 ke 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.
3
user26053