Jawaban yang diterima menyebutkan bahwa " kill -9 PIDtidak berfungsi". Sebagian benar: pada kenyataannya, TIDAK membunuh akan berhasil. Selain itu, -9 harus digunakan sebagai pilihan terakhir. 99% dari waktu proses default kill dari parent akan membunuhnya DAN menuai semua anak. "Bunuh default" adalah SIGTERM (-15). Saya mendorong penggemar -9 (SIGKILL) untuk membaca stackoverflow.com/questions/690415/…
Dari hasil Anda, kami melihat "mati", yang berarti proses telah menyelesaikan tugasnya atau telah rusak atau terbunuh, tetapi proses anaknya masih berjalan atau proses induk ini memantau proses anaknya. Untuk membunuh proses semacam ini, kill -9 PID tidak berfungsi. Anda dapat mencoba untuk membunuh mereka dengan perintah ini tetapi itu akan menunjukkan ini lagi dan lagi.
Tentukan yang merupakan proses induk dari proses mati ini dan bunuh. Untuk mengetahui ini jalankan perintah:
Anda tidak dapat membunuh proses "mati". Anda hanya bisa mempercepat penghapusan entri di tabel proses dengan membunuh induknya.
jfs
57
Bagaimana jika ppid adalah 1( init)? Seandainya saya harus menunggu?
Luc
7
untuk mengotomatiskan kill, Anda dapat melakukan ini juga (mungkin perlu mengubah byte yang Anda potong dari output):ps -ef | grep defunct | grep -v grep | cut -b8-20 | xargs kill -9
warren
3
@warren, terima kasih. Anda juga dapat membuatnya sedikit lebih pendek dan (imo) lebih sederhana dengan tidak melakukan grep kedua. Cukup ganti grep pertama grep [d]efunctatau yang serupa dan itu tidak akan cocok dengan dirinya sendiri.
Thor84no
4
@warren Anda tidak dapat membunuh proses yang mati - bahkan dengan SIGKILL. Terlebih lagi, Anda menggunakan kill -9 yang tidak pandang bulu. Lihat stackoverflow.com/questions/690415/… . Jika Anda ingin membunuh anak-anak sudah tidak berfungsi, Anda dapat mencoba: parents_of_dead_kids=$(ps -ef | grep [d]efunct | awk '{print $3}' | sort | uniq | egrep -v '^1$'); echo "$parents_of_dead_kids" | xargs kill. Jalankan kembali skrip setelah 30 detik atau lebih, dengan kill -9jika Anda inginkan. (Perhatikan bahwa saya secara khusus melarang pembunuhan Init)
Proses yang ditandai <defunct>adalah proses mati (disebut "zombie" ) yang tetap karena induknya belum menghancurkannya dengan benar. Proses-proses ini akan dihancurkan oleh init(8)jika proses induk keluar.
Anda tidak dapat membunuhnya karena sudah mati. Satu-satunya yang tersisa adalah entri dalam tabel proses :
Pada sistem operasi komputer seperti Unix dan Unix, proses zombie atau proses mati adalah proses yang telah menyelesaikan eksekusi tetapi masih memiliki entri dalam tabel proses. Entri ini masih diperlukan untuk memungkinkan proses induk membaca status keluar anaknya.
Tidak ada salahnya membiarkan proses seperti itu terjadi kecuali ada banyak dari mereka. Zombie akhirnya menuai oleh orang tuanya (dengan menelepon wait(2)). Jika orang tua asli belum memetiknya sebelum keluar sendiri kemudian initproses ( pid == 1) melakukannya di lain waktu. Proses Zombie hanya:
Suatu proses yang telah dihentikan dan yang dihapus ketika status keluarnya telah dilaporkan ke proses lain yang sedang menunggu proses itu berakhir.
Terima kasih Mike S. Kami mengambil baris Anda dan menulis skrip yang akan membunuh proses mati yang orang tuanya ada di .telnetd. Kami tidak ingin itu menghentikan proses induk apa pun, hanya telnetd yang kami tahu menyebabkan masalah dan kami akan menjalankannya beberapa kali untuk membunuh banyak proses jika diperlukan.
# egrep -v '^1$ = Make sure the process is not the init process.
# awk '{print $3}' = Print the parent process.
first_parent_of_first_dead_kid=$(ps -ef | grep [d]efunct | awk '{print $3}' | head -n1 | egrep -v '^1$')
echo "$first_parent_of_first_dead_kid"
# If the first parent of the first dead kid is in.telnetd, then kill it.
if ps -ef | grep $first_parent_of_first_dead_kid | grep in.telnetd;then
echo "We have a defunct process whose parent process is in.telnetd" | logger -t KILL-DEFUNCT-TELNET
echo "killing $first_parent_of_first_dead_kid" | logger -t KILL-DEFUNCT-TELNET
kill $first_parent_of_first_dead_kid 2>&1 | logger -t KILL-DEFUNCT-TELNET
fi
Dari hasil Anda, kami melihat ada yang mati , yang berarti proses anak ini telah menyelesaikan tugasnya atau telah rusak atau terbunuh. Proses induknya masih berjalan dan belum melihat anaknya yang mati.
kill -9 PID tidak akan berfungsi (sudah mati).
Untuk menentukan induk dari proses anak ini, jalankan perintah ini:
ps -ef | grep defunct
UID PID **PPID** C STIME TTY TIME CMD
1000 637 27872 0 Oct12 ? 00:00:04 [chrome] <defunct>
Lihat siapa orang tuanya: ps ax | grep 27872
Jika mau, Anda dapat membunuh orang tua, dan yang mati akan hilang.
kill -9 27872
lihat jawaban JF Sebastian untuk alasan yang lebih teknis.
kill -9 PID
tidak berfungsi". Sebagian benar: pada kenyataannya, TIDAK membunuh akan berhasil. Selain itu, -9 harus digunakan sebagai pilihan terakhir. 99% dari waktu proses default kill dari parent akan membunuhnya DAN menuai semua anak. "Bunuh default" adalah SIGTERM (-15). Saya mendorong penggemar -9 (SIGKILL) untuk membaca stackoverflow.com/questions/690415/…Jawaban:
Dari hasil Anda, kami melihat "mati", yang berarti proses telah menyelesaikan tugasnya atau telah rusak atau terbunuh, tetapi proses anaknya masih berjalan atau proses induk ini memantau proses anaknya. Untuk membunuh proses semacam ini, kill -9 PID tidak berfungsi. Anda dapat mencoba untuk membunuh mereka dengan perintah ini tetapi itu akan menunjukkan ini lagi dan lagi.
Tentukan yang merupakan proses induk dari proses mati ini dan bunuh. Untuk mengetahui ini jalankan perintah:
ps -ef | grep defunct
Lalu
kill -9 637 27872
, kemudian verifikasi proses yang mati sudah lewatps -ef | grep defunct
.sumber
1
(init
)? Seandainya saya harus menunggu?ps -ef | grep defunct | grep -v grep | cut -b8-20 | xargs kill -9
grep [d]efunct
atau yang serupa dan itu tidak akan cocok dengan dirinya sendiri.parents_of_dead_kids=$(ps -ef | grep [d]efunct | awk '{print $3}' | sort | uniq | egrep -v '^1$'); echo "$parents_of_dead_kids" | xargs kill
. Jalankan kembali skrip setelah 30 detik atau lebih, dengankill -9
jika Anda inginkan. (Perhatikan bahwa saya secara khusus melarang pembunuhanInit
)Halaman manual ps (1) mengatakan :
Anda tidak dapat membunuhnya karena sudah mati. Satu-satunya yang tersisa adalah entri dalam tabel proses :
Tidak ada salahnya membiarkan proses seperti itu terjadi kecuali ada banyak dari mereka. Zombie akhirnya menuai oleh orang tuanya (dengan menelepon
wait(2)
). Jika orang tua asli belum memetiknya sebelum keluar sendiri kemudianinit
proses (pid == 1
) melakukannya di lain waktu. Proses Zombie hanya:sumber
Terima kasih Mike S. Kami mengambil baris Anda dan menulis skrip yang akan membunuh proses mati yang orang tuanya ada di .telnetd. Kami tidak ingin itu menghentikan proses induk apa pun, hanya telnetd yang kami tahu menyebabkan masalah dan kami akan menjalankannya beberapa kali untuk membunuh banyak proses jika diperlukan.
sumber
memperluas jawaban Paddington ..
Dari hasil Anda, kami melihat ada yang mati , yang berarti proses anak ini telah menyelesaikan tugasnya atau telah rusak atau terbunuh. Proses induknya masih berjalan dan belum melihat anaknya yang mati.
kill -9 PID
tidak akan berfungsi (sudah mati).Untuk menentukan induk dari proses anak ini, jalankan perintah ini:
ps -ef | grep defunct
Lihat siapa orang tuanya:
ps ax | grep 27872
Jika mau, Anda dapat membunuh orang tua, dan yang mati akan hilang.
kill -9 27872
lihat jawaban JF Sebastian untuk alasan yang lebih teknis.
sumber
Menambahkan ke jawaban @ Paddington, saya menambahkan fungsi ini ke bashrc saya untuk pemeriksaan cepat:
Ini menghasilkan sesuatu seperti:
sumber