kill -9 program tetapi mereka masih bertahan

11

Saya mencoba untuk mematikan semua pekerjaan latar belakang saya sebelumnya di bawah KUbuntu oleh

kill -9 $(jobs -p)

Meskipun perintah ini segera memberi pesan seperti

[1] Membunuh myjob1

[2] Membunuh myjob2

Saya masih bisa melihat proses mereka tergantung pada output atas dan penggunaan CPU dan memori tidak berubah dalam output uptime dan gratis.

Jadi saya kira saya harus tidak membunuh mereka dengan benar. Bisakah seseorang tolong jelaskan apa yang terjadi pada saya dan apa yang harus saya lakukan?

Saya menemukan bahwa di atas, jika ketik k dan masukan PID saya dapat mematikan proses satu per satu. JADI, apakah ini berbeda dengan perintah kill?

Saya juga menemukan tempat online http://www.ruhr.de/home/smallo/award.html tentang tidak merekomendasikan kill -9

Penggunaan huruf formulir Kill -9 yang tidak berguna

(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.

Apakah ini benar? Apa yang dimaksud dengan "kirim 15", "kirim 2" dan "kirim 1"? Apakah mereka perintah sendiri atau "kill -15 PID", "kill -2 PID" dan "kill -1 PID"?

Terima kasih dan salam!

Tim
sumber
Menghapus biner (file yang dapat dieksekusi) tidak dengan sendirinya akan mematikan proses. Sistem file akan mengetahui proses menggunakan file itu dan membiarkan proses "melihat" file bahkan setelah Anda menghapusnya.
Jeppe Stig Nielsen

Jawaban:

9

Proses Anda mungkin mati tetapi masih muncul di entri tabel proses karena ini adalah "proses zombie". Ketika proses anak dihentikan dan benar-benar menghilang (kecuali entri tabel prosesnya) dan orang tua tidak dapat mengambil status terminasi (melalui salah satu fungsi menunggu), itu disebut zombie ... Membunuh (melalui sinyal) zombie tidak akan bekerja karena sudah dihentikan. Yang perlu Anda lakukan adalah mencari tahu proses induknya dan membunuh thjat one cleany, sehingga tidak menggunakan kill - 9

berikut adalah dua langkah sederhana untuk membunuh zombie ...

  1. jika orang tua masih hidup, cobalah untuk membunuhnya (atau SIGHUP adalah yang Anda butuhkan)
  2. jika nomor 1 gagal, ada bug di kernel .... reboot adalah teman Anda dan perbaiki bug itu: ->
nkr1pt
sumber
Saya menyerahkan pekerjaan saya di baris perintah dan di latar belakang, seperti apa orang tua mereka? Dan bagaimana saya bisa menemukan orang tua mereka jika ada?
Tim
Gunakan -fbendera untuk ps untuk melihat proses induk.
Jack M.
6

lihat man killdefinisi berbagai sinyal yang tersedia, tetapi ya.

  • 15 adalah SIGTERM , dan meminta program untuk keluar.
  • 2 adalah SIGINT dan setara dengan Control-C
  • 1 adalah SIGHUP , dan menunjukkan bahwa terminal telah menutup telepon.

Ini menginformasikan suatu proses bahwa pengguna "selesai" dengan proses tersebut, meskipun mereka menunjukkan alasan yang agak berbeda. sedang melakukan dan berhenti ", SIGHUP hanya berarti tidak ada yang mendengarkan lagi (proses server mungkin bereaksi secara sah terhadap SIGHUP dengan menghentikan output konsolnya dan terus berjalan).

  • 9 adalah SIGKILL , dan istimewa karena itu adalah satu-satunya proses yang tidak dapat ditangkap dan ditangani secara internal. Ini hanya menghasilkan kernel yang tidak pernah kembali mengontrol proses, tidak memberikan kesempatan untuk membersihkan.
puetzk
sumber
di atas, jika ketik k dan masukan PID saya bisa mematikan proses satu per satu. Jadi apakah ini setara dengan beberapa opsi untuk perintah kill?
Tim
Ya, top hanya mengirimkan sinyal ke proses, sama seperti kill. AFAICT, sinyal default yang digunakan top adalah 15 (SIGTERM).
puetzk
1

Itu berarti menggunakan kill -15 PID(atau nomor lain) alih-alih kill -9 PID. Jumlahnya setara dengan sinyal unix yang berbeda .

Adriano Varoli Piazza
sumber
1

Ini berarti ketik "kill -1" atau "kill -15" daripada mengetik "kill -9". Bunuh -9 adalah peluru hardcore di kepala setiap proses yang berjalan, membunuhnya mati dalam keadaan kotor yang dapat menyebabkan memori bocor, bla bla.

Jika Anda mengetikkan kill -9 dan tidak berfungsi, maka saya akan memastikan prosesnya tidak muncul kembali, dan Anda memiliki izin untuk mematikan proses itu.

Satanicpuppy
sumber
Bagaimana Anda melihat untuk memastikan proses tidak mendapatkan respawned? Karena saya memiliki proses, apakah saya memiliki izin untuk mematikan proses itu?
Tim
Itu harus memiliki nomor proses yang berbeda jika ya. Jadi jika Anda melakukan ps -Al dan Anda melihat processA, maka Anda membunuh -9 processA, dan kemudian melakukan ps -Al dan ada MASIH sebuah prosesA dalam antrian proses, pastikan itu adalah proses SAMA, dan bukan yang baru.
Satanicpuppy
Dan itu akan memberi tahu Anda jika Anda tidak memiliki izin untuk membunuh prosesnya.
Satanicpuppy
0

Sinyal 9 adalah SIGKILL. Mengirim SIGKILL meminta OS untuk segera menghentikan proses, tidak ada pertanyaan. Prosesnya tidak diberitahukan sebelumnya dan tidak memiliki kesempatan untuk membersihkan setelahnya.

Sinyal 15 adalah SIGTERM. Mengirim SIGTERM meminta OS untuk meminta proses mematikan dirinya.

SIGKILL dapat diabaikan jika OS berpikir prosesnya adalah melakukan IO, atau jika itu adalah Zombie (Proses anak yang orang tuanya tidak membersihkan setelah itu).

SIGTERM mungkin diabaikan oleh aplikasi, tetapi tidak direkomendasikan bahwa aplikasi melakukan ini, karena OS mengirim SIGTERM selama shutdown, segera diikuti oleh SIGKILL jika suatu program masih berjalan.

Catatan: Baris perintah killselalu meminta OS untuk mengirim sinyal ke aplikasi, yang mungkin atau mungkin tidak dilakukan berdasarkan siapa yang memiliki proses, dll ...

Powerlord
sumber