Jawaban:
Ya Tuhan! Tidak tidak Tidak. Jangan gunakan kill -9.
Itu tidak memberi proses kesempatan untuk bersih:
matikan koneksi soket
membersihkan file temp
beri tahu anak-anaknya bahwa ia akan pergi
atur ulang karakteristik terminalnya dan seterusnya 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.
Proses zombie (sebenarnya sekarang mereka disebut <defunct>
) sebenarnya bukan proses. Itu hanya masuk dalam tabel proses, sehingga proses induk dapat melakukan wait()
syscall .
Anda tidak perlu khawatir tentang mereka. Mereka tidak menempati sumber daya apa pun, mereka akan menghilang baik ketika orang tua mereka memanggil wait()
ketika orang tua itu sendiri mati.
Ini adalah proses yang telah sepenuhnya dialokasikan tetapi masih ada dalam tabel proses. Bandingkan ini dengan proses anak yatim, yang orang tuanya telah meninggal tetapi masih dieksekusi.
Berikut ini beberapa saran untuk menyingkirkannya.
Namun, sudah ada jawaban yang diterima: Anda BISA membunuh proses zombie. Lampirkan dengan debugger ke proses induk dan panggil fungsi waitpid. Misalnya: - mari kita asumsikan bahwa orang tua memiliki PID = 100, proses zombie memiliki PID = 200
$ gdb -p 100
(gdb) call waitpid(200, 0, 0)
(gdb) quit
Proses zombie tidak memiliki sumber daya yang dialokasikan untuk itu apa pun, selain entri di pohon proses. Ini terjadi ketika suatu proses selesai, namun proses induk belum memetiknya , (yaitu, wait
ed di atasnya).
Anda dapat mencoba dan memaksa orang tua untuk melakukan ini jika Anda mau dengan mengirimkannya SIGCHLD ( kill -20
), kepada orang tua, tetapi tidak ada jaminan bahwa orang tua akan menghormatinya.
Anda akan sering melihatnya dalam waktu yang singkat (misalnya saat melihat pohon proses menggunakan atas) - ini normal; Dalam irisan waktu antara waktu proses anak selesai, dan jajak pendapat orang tua untuk itu - proses anak akan muncul sebagai zombie.
Jika Anda melihat proses zombie yang terus ada - yang tidak normal - masih tidak perlu khawatir - lagi karena tidak ada sumber daya yang dialokasikan untuk proses mati - umumnya berarti bahwa aplikasi ini ditulis dengan buruk oleh pengembang jelek.
Satu-satunya waktu Anda harus khawatir dari proses zombie, adalah ketika Anda melihat banyak dan banyak dari mereka, misalnya jika aplikasi jelek yang sama yang disebutkan di atas ditempatkan di bawah beban.
Kami memiliki banyak pengembang yang buruk di tempat saya bekerja, dan jadi saya memiliki hak istimewa untuk menangani masalah seperti itu dan mempelajari segala macam hal yang tidak berguna saat melakukannya. Bahkan - tim saya sering menggunakan skrip shell jelek yang ditulis oleh pengembang jelek dalam wawancara - jika kandidat dapat memilih bahwa skrip tersebut memang jelek, dan memberi tahu kami mengapa skrip itu jelek, ia memiliki kaki yang bagus di pintu.
Adapun senapan virtual ...
$ shoot <pid>
#! / bin / sh korban = `ps -e -o pid, ppid | egrep "^ \ s * $ 1 \ b" | awk '{print $ 2}' ` korban \ _name = `ps -e -o pid, cmd | egrep "^ \ s * $ {korban} \ b" | kepala -n 1 | awk '{print $ 2}' ` #kill $ {korban} echo "Membunuh $ {korban_name}."
Dan ingat: selalu tembak mereka di kepala.
Proses zombie adalah proses yang telah selesai dieksekusi, tetapi masih tercantum dalam tabel proses.
kill -9 [parent process_name] akan meletakkannya, dengan prasangka ekstrem.