Cara membunuh proses <defunct> dengan orang tua 1

17

Saya menjalankan Bacula di kotak RedHat. Dari waktu ke waktu, daemon penyimpanan bacula-sd berhenti bekerja dan menjadi <defunct>.

[root@backup ~]# ps -ef | grep defunct | more
root      4801 29261  0 09:25 pts/5    00:00:00 grep defunct
root      5825     1  0 Oct18 ?        00:00:00 [bacula-sd] <defunct>

Pertanyaan saya adalah, bagaimana saya bisa mematikan proses ini? Induknya adalah 1, yang merupakan init, sejauh yang saya tahu, dan saya tidak ingin membunuh proses init, bukan?

'Biasanya' membunuh proses ini tidak berhasil:

[root@backup ~]# kill -0 5825
[root@backup ~]# kill -9 5825

Bantuan sangat dihargai!

Edit: berjalan

[root@backup ~]# lsof -p 5825

menghasilkan output berikut:

COMMAND    PID USER   FD   TYPE  DEVICE     SIZE    NODE NAME
bacula-sd 5825 root  cwd    DIR   253,0     4096 3801089 /root
bacula-sd 5825 root  rtd    DIR   253,0     4096       2 /
bacula-sd 5825 root  txt    REG   253,0  2110599  368004 /usr/local/sbin/bacula-sd
bacula-sd 5825 root  mem    REG   253,0    75284  389867 /usr/lib/libz.so.1.2.3
bacula-sd 5825 root  mem    REG   253,0    46680 3604521 /lib/libnss_files-2.5.so
bacula-sd 5825 root  mem    REG   253,0   936908  369115 /usr/lib/libstdc++.so.6.0.8
bacula-sd 5825 root  mem    REG   253,0   125736 3606807 /lib/ld-2.5.so
bacula-sd 5825 root  mem    REG   253,0  1602128 3606885 /lib/libc-2.5.so
bacula-sd 5825 root  mem    REG   253,0   208352 3606892 /lib/libm-2.5.so
bacula-sd 5825 root  mem    REG   253,0   125744 3606887 /lib/libpthread-2.5.so
bacula-sd 5825 root  mem    REG   253,0    25940 3604573 /lib/libacl.so.1.1.0
bacula-sd 5825 root  mem    REG   253,0    15972 3604535 /lib/libattr.so.1.1.0
bacula-sd 5825 root  mem    REG   253,0    46548 3606908 /lib/libgcc_s-4.1.2-20080102.so.1
bacula-sd 5825 root  mem    REG   253,0 56422480  366368 /usr/lib/locale/locale-archive
bacula-sd 5825 root    0r   CHR     1,3             1545 /dev/null
bacula-sd 5825 root    1r   CHR     1,3             1545 /dev/null
bacula-sd 5825 root    2r   CHR     1,3             1545 /dev/null
bacula-sd 5825 root    3u   CHR   9,128             6469 /dev/nst0
bacula-sd 5825 root    4u  IPv4 1023380              TCP backup:bacula-sd (LISTEN)
bacula-sd 5825 root    5u  IPv4 2693268              TCP backup:bacula-sd->backup:53957 (CLOSE_WAIT)
bacula-sd 5825 root    7u  IPv4 3248683              TCP backup:bacula-sd->backup:57629 (CLOSE_WAIT)
bacula-sd 5825 root    8u  IPv4 3250966              TCP backup:bacula-sd->backup:37650 (CLOSE_WAIT)
bacula-sd 5825 root    9u  IPv4 3253908              TCP backup:bacula-sd->backup:37671 (CLOSE_WAIT)
andreas-h
sumber

Jawaban:

18

Satu-satunya cara Anda bisa menghapus proses zombie / mati, adalah dengan membunuh orang tua. Karena induknya adalah init (pid 1), itu juga akan menghapus sistem Anda.

Ini cukup banyak membuat Anda memiliki dua opsi.

  • Secara manual memodifikasi tabel proses, misalnya. buat proses dummy, tautkan proses yang mati sebagai anak dummy, lalu bunuh mereka. Cukup berbahaya, dan Anda mungkin harus secara manual membersihkan sumber daya proses lainnya seperti semaphores dan file handle.
  • Mulai ulang sistem.

Saya akan memilih yang kedua.

Roy
sumber
2
+1. Namun, tidak ada terburu-buru untuk melakukannya, selama lebih banyak proses zombie tidak muncul, atau proses zombie Anda belum mengunci 4G RAM Anda. :)
Kyle Smith
1
"Karena induknya adalah init (pid 1), itu juga akan menurunkan sistem Anda" - Anda tidak dapat membunuh initkarena tidak memiliki penangan sinyal untuk SIGKILL. Lihat man 2 kill.
Cawflands
Bagaimana Anda melakukan yang pertama?
skerit
@AndrewH Saya tidak yakin SIGKILL tergantung pada penangan sinyal dalam proses target, tetapi memang benar bahwa kernel yang khas akan mengabaikan SIGKILL untuk init. Namun, jika Anda kehabisan cara yang lebih dingin untuk memicu panik kernel, saya pikir Anda akan menemukan bahwa pada sebagian besar sistem Linux SIGSEGV akan melakukannya dengan cukup baik.
Roy
1
Perlu dicatat bahwa salah satu initpekerjaan adalah untuk menuai proses zombie, jadi jika Anda menunggu cukup lama initharus membersihkan proses zombie. Meskipun, kebanyakan inits harus mengatur handler SIGCHLDuntuk menjadi SIG_IGN yang memperbaiki ini.
cyphar
3

Anda dapat mencoba memulai kembali init:

 # telinit u

Kalau tidak, saya tidak akan terlalu khawatir. Ini tidak berjalan dan tidak mengambil sumber daya apa pun dan hanya ada di sana sehingga kernel dapat mengingatnya.

David Pashley
sumber
1
baik, saya agak perlu khawatir. ini adalah mesin produksi yang menjalankan layanan cadangan (bacula) dan voip (asterisk). selama proses bacula-sd berfungsi ada, bacula tidak bisa mengakses tape drive ...
andreas-h
Seharusnya tidak ada file yang terbuka. Jalankan lsof -p 5825 dan periksa.
David Pashley
Ya, sepertinya ada banyak hal yang terbuka ... lihat di atas. Ada ide yang bisa saya lakukan? Saya tidak pernah menggunakan lsof ...
andreas-h
1
Ya, zombie Anda memiliki / dev / nst0 terbuka. Boot ulang sistem mungkin merupakan pilihan terbaik saat ini.
Kyle Smith
5
Yap, reboot sepertinya menjadi jawaban yang berlaku. Saya selalu merasa gagal ketika saya harus me-reboot server. :(
David Pashley
3

Periksa apakah ada panik kernel,

# dmesg |tail

Periksa apakah prosesnya dalam "D" Unkillable sleep, di mana itu dalam mode kernel untuk beberapa syscall yang belum kembali (baik kernel oops, atau alasan lain) http://www.nabble.com/What-causes-an -unkillable-process - td20645581.html

Dijeda sampai pemberitahuan lebih lanjut.
sumber
format menjengkelkan
asdmin
sebenarnya, belum ada panik kernel. prosesnya dalam keadaan 'Z' - zombie ...
andreas-h
3

Jika zombie memiliki init sebagai induknya, maka init telah berhenti berfungsi dengan benar. Salah satu peran init adalah untuk membersihkan zombie. Jika tidak melakukannya, tidak ada orang lain yang akan melakukannya. Jadi satu-satunya solusi adalah reboot. Jika init rusak, maka reboot mungkin gagal, jadi saya akan mematikan layanan penting, sinkronkan sistem file lalu tekan tombol power.

MarkR
sumber
Saya setuju tentang init tidak berfungsi dengan benar. Lihat juga: upstartdan systemd.
Mikko Rantalainen
2

Mari kita tetap panik, ya? Proses "mati" atau "zombie" bukanlah proses . Ini hanyalah sebuah entri dalam tabel proses, dengan kode keluar yang disimpan. Jadi, zombie tidak memiliki sumber daya, tidak menggunakan siklus CPU, dan tidak menggunakan memori, karena itu bukan proses . Jangan menjadi aneh dan gatal mencoba untuk "membunuh" proses zombie. Sama seperti senama mereka, mereka tidak bisa dibunuh, karena mereka sudah mati. Tetapi tidak seperti jenis pemakan otak, mereka sama sekali tidak membahayakan siapa pun, dan tidak akan menggigit proses lain.

Jangan biarkan proses zombie memakan otak Anda. Abaikan saja.

Teddy
sumber
11
Ya, itulah teorinya. Sayangnya itu tidak selalu benar. Proses yang mati terkadang akan bergantung pada sumber daya sistem, seperti andreash telah didokumentasikan dengan jelas.
Roy
5
Dalam kasusnya, sesuai dengan outputnya, proses zombie memakan otak / dev / nst0. Dia membutuhkan otak-otak itu untuk melanjutkan operasi pencadangan.
Kyle Smith
2
Seorang administrator sistem yang menghabiskan karirnya mengabaikan proses Zombie pada akhirnya akan terbangun di tengah malam dengan kehidupan mereka tersedot keluar dari mereka. Zombie, dalam pengalaman saya, menunjukkan sesuatu yang salah. Saya menulis ini bahkan ketika anak zombie memiliki beberapa interaksi aneh dengan orang tuanya, dan orang tua memutar CPU saya. Saya tidak tahu salah siapa itu, tetapi intinya adalah bahwa Zombi jelek dan mengabaikan mereka suatu hari akan datang menghantui Anda. ... Suatu hari ... ketika Anda tidur nyenyak ... di tengah malam ... setelah hari musim gugur yang dingin ...
Mike S
@ Mike Saya tertawa terbahak-bahak dari komentar Anda!
Paul Calabro
@ Mike benar. Saya memiliki ssh-agent yang tidak berfungsi dan ssh atau git tidak dapat berjalan dengan baik. hanya restart yang bisa membantu. (perbaikan yang sama seperti windows memiliki ... haha)
John Tribe
0

Sepertinya Anda punya proses yatim. Sejauh yang saya tahu satu-satunya cara untuk membunuh ini adalah dengan reboot kotak. Saya pernah mengalami hal ini pada server ESX saya (yang merupakan linux di bawah tenda) dari waktu ke waktu dan reboot host adalah perbaikan (dari dukungan VMware).

Saya seorang pria Windows jadi ambil untuk apa nilainya.

mrdenny
sumber
sayangnya, me-reboot bukanlah opsi yang nyata. itu mesin produksi juga menjalankan layanan VoIP, jadi saya tidak bisa reboot itu selama jam kerja ...
andreas-h
1
jadi, Anda bisa reboot setelah jam kantor, kan?
warren