GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Jika 'kill -9' Tidak Berfungsi?

Saya memiliki proses yang tidak dapat saya bunuh dengan kill -9 <pid> . Apa masalahnya dalam kasus seperti itu, terutama karena saya adalah pemilik proses itu. Saya pikir tidak ada yang bisa menghindari kill pilihan.

Jawaban yang Diterima:

kill -9 (SIGKILL) selalu berfungsi, asalkan Anda memiliki izin untuk mematikan prosesnya. Pada dasarnya baik proses harus dimulai oleh Anda dan tidak setuid atau setgid, atau Anda harus root. Ada satu pengecualian:bahkan root tidak dapat mengirim sinyal fatal ke PID 1 (init proses).

Namun kill -9 tidak dijamin untuk bekerja segera . Semua sinyal, termasuk SIGKILL, dikirimkan secara asinkron:kernel mungkin memerlukan waktu untuk mengirimkannya. Biasanya, pengiriman sinyal membutuhkan waktu paling lama beberapa mikrodetik, hanya waktu yang dibutuhkan target untuk mendapatkan potongan waktu. Namun, jika target memblokir sinyal, sinyal akan diantrekan hingga target membuka blokirnya.

Biasanya, proses tidak dapat memblokir SIGKILL. Tetapi kode kernel dapat, dan proses mengeksekusi kode kernel ketika mereka memanggil panggilan sistem. Kode kernel memblokir semua sinyal saat menginterupsi panggilan sistem akan menghasilkan struktur data yang terbentuk dengan buruk di suatu tempat di kernel, atau lebih umum di beberapa invarian kernel yang dilanggar. Jadi jika (karena bug atau salah desain) panggilan sistem diblokir tanpa batas, mungkin tidak ada cara untuk mematikan proses secara efektif. (Tapi prosesnya akan dibunuh jika pernah menyelesaikan panggilan sistem.)

Proses yang diblokir dalam panggilan sistem berada dalam mode tidur tanpa gangguan. ps atau top perintah akan (pada kebanyakan unices) menampilkannya dalam status D (awalnya untuk “d isk”, saya pikir).

Kasus klasik dari tidur panjang tanpa gangguan adalah proses mengakses file melalui NFS saat server tidak merespons; implementasi modern cenderung tidak memaksakan tidur yang tidak pernah terputus (misalnya di Linux, intr opsi mount memungkinkan sinyal untuk mengganggu akses file NFS).

Jika suatu proses tetap dalam tidur tanpa gangguan untuk waktu yang lama, Anda bisa mendapatkan informasi tentang apa yang dilakukannya dengan melampirkan debugger padanya, dengan menjalankan alat diagnostik seperti strace atau dtrace (atau alat serupa, tergantung pada rasa unix Anda), atau dengan mekanisme diagnostik lain seperti /proc/PID/syscall di bawah Linux. Lihat Tidak dapat mematikan proses wget dengan `kill -9` untuk diskusi lebih lanjut tentang cara menyelidiki proses dalam tidur yang tidak pernah terputus.

Terkait:Bagaimana cara kerja lisensi untuk kerangka kerja sumber terbuka LGPL?

Terkadang Anda mungkin melihat entri bertanda Z (atau H di Linux, saya tidak tahu apa perbedaannya) di ps atau top keluaran. Ini secara teknis bukan proses, ini adalah proses zombie, yang tidak lebih dari entri dalam tabel proses, disimpan sehingga proses induk dapat diberitahu tentang kematian anaknya. Mereka akan pergi ketika proses induk memperhatikan (atau mati).


Linux
  1. Apa yang mematikan proses saya dan mengapa?

  2. Apa yang harus dilakukan ketika Ctrl + C tidak dapat menghentikan proses?

  3. Apa artinya membunuh -3?

  1. Apa itu NGINX? Bagaimana cara kerjanya?

  2. Linux – Kapan Saya Tidak Harus Membunuh -9 Proses?

  3. Pengulangan otomatis tidak berfungsi

  1. Mengapa Substitusi Proses Bash Tidak Bekerja Dengan Beberapa Perintah?

  2. Linux – Mengapa Setuid Tidak Bekerja??

  3. Mengapa `keluar &` Tidak Berfungsi?