Bagaimana cara membunuh proses yang tidak dapat dibunuh tanpa me-reboot?

11

Ada 5 proses yang tidak bisa dibunuh oleh kill -9 $PIDdan mengeksekusi cat /proc/$PID/cmdlineakan menggantung sesi saat ini. Mungkin itu adalah proses zombie.

Eksekusi ps -ef or htopjuga akan menggantung sesi saat ini. Tapi topdan ps -ebekerja dengan baik.

Jadi sepertinya ada dua masalah yang tidak ditanggapi oleh sistem file.

Ini adalah mesin produksi yang menjalankan mesin virtual, jadi me-reboot bukanlah pilihan.

Id proses berikut tidak berfungsi: 16181 16765 5985 7427 7547

Induk proses ini adalah init

        ├─collectd(16765)─┬─{collectd}(16776)
        │                 ├─{collectd}(16777)
        │                 ├─{collectd}(16778)
        │                 ├─{collectd}(16779)
        │                 ├─{collectd}(16780)
        │                 └─{collectd}(16781)
        ├─collectd(28642)───{collectd}(28650)
        ├─collectd(29868)─┬─{collectd}(29873)
        │                 ├─{collectd}(29874)
        │                 ├─{collectd}(29875)
        │                 └─{collectd}(29876)

Dan salah satu proses qemu tidak berfungsi

|-qemu-system-x86(16181)-+-{qemu-system-x86}(16232)
|                        |-{qemu-system-x86}(16238)
|                        |-{qemu-system-x86}(16803)
|                        |-{qemu-system-x86}(17990)
|                        |-{qemu-system-x86}(17991)
|                        |-{qemu-system-x86}(17992)
|                        |-{qemu-system-x86}(18062)
|                        |-{qemu-system-x86}(18066)
|                        |-{qemu-system-x86}(18072)
|                        |-{qemu-system-x86}(18073)
|                        |-{qemu-system-x86}(18074)
|                        |-{qemu-system-x86}(18078)
|                        |-{qemu-system-x86}(18079)
|                        |-{qemu-system-x86}(18086)
|                        |-{qemu-system-x86}(18088)
|                        |-{qemu-system-x86}(18092)
|                        |-{qemu-system-x86}(18107)
|                        |-{qemu-system-x86}(18108)
|                        |-{qemu-system-x86}(18111)
|                        |-{qemu-system-x86}(18113)
|                        |-{qemu-system-x86}(18114)
|                        |-{qemu-system-x86}(18119)
|                        |-{qemu-system-x86}(23147)
|                        `-{qemu-system-x86}(27051)
Sam Stoelinga
sumber
1
Proses zombie seharusnya tidak menyebabkan masalah. Jika jumlah proses Zombie begitu besar sehingga melebihi batas proses pada server maka itu akan menyebabkan masalah.
Raza
@Salton: Kita tidak bisa menggunakan ps -ef dan htop jadi kita punya masalah, mungkin yang kita lihat tidak disebut proses zombie?
Sam Stoelinga
1
Anda dapat mencoba melacak dengan menggunakan /usr/bin/strace ps -efuntuk melihat di mana tepatnya Anda ps -efmenggantung.
Raza
2
Bagaimana Anda menentukan ini adalah zombie? Ini agak seperti proses gantung. Apakah ps -elberhasil dan di negara mana proses ini berlangsung?
Nils
Pada akhirnya klien masih memutuskan untuk me-reboot mesin karena masalahnya semakin buruk. Terima kasih atas semua masukannya. Belajar banyak tentang zombie dan proses yang tidak dapat dihentikan.
Sam Stoelinga

Jawaban:

22

Anda tidak memiliki zombie. cat /proc/$PID/cmdlinetidak akan punya masalah dengan zombie. Jika kill -9tidak mematikan program , itu berarti program sedang melakukan beberapa operasi I / O yang tidak pernah terputus. Itu biasanya menunjukkan satu dari tiga hal:

  • sistem file jaringan yang tidak merespons;
  • bug kernel;
  • bug perangkat keras.

Utilitas seperti psmungkin hang jika mereka mencoba membaca beberapa informasi seperti jalur proses yang dapat dieksekusi yang tidak disediakan oleh kernel untuk salah satu alasan di atas.

Coba cat /proc/16181/syscalllihat proses apa yang dilakukan 16181. Ini mungkin atau mungkin tidak berfungsi tergantung pada seberapa jauh sistem Anda berjalan.

Jika masalahnya adalah sistem file jaringan, Anda mungkin dapat melepas-paksa secara paksa, atau membuatnya online. Jika masalahnya adalah bug kernel atau perangkat keras, apa yang dapat Anda lakukan akan tergantung pada sifat bug tersebut. Reboot (dan memutakhirkan ke kernel tetap, atau mengganti perangkat keras yang rusak) sangat disarankan.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Kucing tidak pernah merespons. Saya rasa ini bukan bug. saya pikir itu adalah "fitur".
Burung Hantu
7

Jawaban lain dengan asumsi ini adalah proses zombie. Proses zombie adalah proses yang telah selesai berjalan, tetapi masih dalam tabel proses jika orang tua ingin mengetahui status keluar. Ini adalah hal yang normal, dan initsecara otomatis akan membersihkan proses zombie yang ditugaskan padanya.

Proses zombie tidak boleh menyebabkan apa pun untuk digantung, jadi sepertinya itu bukan masalah Anda. Jika itu adalah panggilan sistem atau driver yang menggantung, maka prosesnya mungkin dalam keadaan tidak terputus. Ada penjelasan yang bagus di sini .

David Baggerman
sumber
Terlalu banyak proses zombie dapat mencegah forkdari berhasil (ketika sulit nrpocdicapai) karena mereka masih menempati ruang dalam tabel proses.
dhchdhd
2

Untuk menemukan proses zombie di Linux:

$ ps axo stat, ppid, pid, comm | grep -w mati

Z 555 10242 Sial-Zombie <mati>

Pertama, Anda dapat mencoba mengirim sinyal SIGCHLD ke proses induk zombi menggunakan perintah kill. Perhatikan bahwa perintah di atas memberi Anda PPID (PID proses induk) dari masing-masing zombie. Dalam contoh kita, PPID zombie adalah 555.

$ sudo kill -s SIGCHLD 555

Jika proses zombie masih belum hilang, Anda dapat membunuh proses induk (misalnya, 555) dari zombie.

$ sudo kill -9 555

Setelah proses induknya terbunuh, zombie akan diadopsi oleh proses init, yang merupakan induk dari semua proses di Linux. Proses init secara berkala memanggil wait()untuk menuai setiap proses zombie.

HamTheAstroChimp
sumber
Inilah jawaban sebenarnya. Membunuh orang tua berhasil, terima kasih.
Andrew
1

Anda hanya dapat membunuh zombie dengan membunuh orang tuanya. Proses zombie telah merilis semua sumber dayanya dan menunggu status keluarnya diambil oleh induknya. Itu menjadi zombie ketika orang tua tidak mengeksekusi waituntuk mengambil status keluar dari anaknya. Ketika Anda membunuh orang tua zombie, initmengambil status keluar dan zombie akhirnya mati.

unxnut
sumber
Jadi kamu ingin aku membunuh init? Tidak jelas dari pertanyaan maaf hehe tapi orang tua sepertinya init :( Saya sudah mengedit pertanyaan.
Sam Stoelinga
4
Tidak, kami ingin Anda tidak mencoba membunuh zombie. Anda tidak dapat membunuh zombie. FAQ ini setua Unix itu sendiri.
tripleee
@ tripleee: Ya itulah yang saya mengerti. Mungkin yang saya alami bukanlah zombie. htop tidak berfungsi dan cat / proc / $ pid / cmdline atau ls / proc / $ pid / juga tidak berfungsi. Biasanya ini tidak terjadi dengan zombie itu sebabnya saya bertanya di sini, ini bukan masalah biasa. Saya telah memeriksa beberapa jawaban yang semuanya memberitahu Anda untuk membunuh orang tua, yang init dalam kasus saya atau untuk reboot.
Sam Stoelinga
1
"Bunuh orang tua" adalah cara untuk menuai zombie biasa. Kamu tidak bisa membunuh init. Jika zombie direparasi di bawah init, Anda tidak bisa membunuhnya.
tripleee