Apa itu proses <defunct>, dan mengapa tidak terbunuh?

180

Peramban krom tidak responsif dan saya mencoba membunuhnya, tetapi alih-alih menghilang prosesnya ada <defunct>di kanannya, dan tidak terbunuh:

masukkan deskripsi gambar di sini

Apa itu <defunct>untuk suatu proses dan mengapa itu tidak terbunuh?

Eduard Florinescu
sumber
3
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/…
Mike S

Jawaban:

172

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

UID          PID     PPID       C    STIME      TTY          TIME              CMD
1000       637      27872      0   Oct12      ?        00:00:04 [chrome] <defunct>
1000      1808      1777       0    Oct04     ?        00:00:00 [zeitgeist-datah] <defunct>

Lalu kill -9 637 27872, kemudian verifikasi proses yang mati sudah lewat ps -ef | grep defunct.

Paddington
sumber
13
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)
Mike S
60

Halaman manual ps (1) mengatakan :

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.

jfs
sumber
1

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
David Brazzeal
sumber
1

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

 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.

kevinf
sumber
1

Menambahkan ke jawaban @ Paddington, saya menambahkan fungsi ini ke bashrc saya untuk pemeriksaan cepat:

defunct(){
    echo "Children:"
    ps -ef | head -n1
    ps -ef | grep defunct
    echo "------------------------------"
    echo "Parents:"
    ppids="$(ps -ef | grep defunct | awk '{ print $3 }')"
    echo "$ppids" | while read ppid; do
        ps -A | grep "$ppid"
    done
}

Ini menghasilkan sesuatu seperti:

Anak-anak:
UID PID PPID C STIME TTY TIME CMD
pengguna 25707 25697 0 Feb26 poin / 0 00:00:00 [sh] 
pengguna 30381 29915 0 11:46 poin / 7 00:00:00 grep mati
------------------------------
Orangtua:
25697 poin / 0 00:00:00 npm
agregat1166877
sumber