Jika skrip berjalan dengan baik dari baris perintah, mengapa skrip yang sama menjadi status zombie setelah dijalankan melalui cron dan Bagaimana Anda akan memecahkan masalah yang sama?
Berikut contoh nyata berikut ini:
[root@abc ~]# ps ax | grep Z
23880 ? Zs 0:00 [checkloadadv.sh] <defunct>
23926 pts/0 S+ 0:00 grep Z
[root@abc ~]# strace -p 23880
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
[root@abc ~]# pstree | grep checkload
init-+-crond---crond-+-checkloadadv.sh
[root@abc ~]# bash /usr/bin/checkloadadv.sh
System Load is OK : 0.05
process
zombie-process
Rahul Patil
sumber
sumber
Jawaban:
Seperti zombie yang sebenarnya, proses zombie tidak bisa dibunuh, karena sudah mati.
Bagaimana itu terjadi?
Ketika di Linux / Unix suatu proses mati / berakhir semua informasi dari proses akan dihapus dari memori sistem, hanya deskriptor proses tetap. Prosesnya dalam keadaan Z (zombie). Proses induknya mendapat sinyal dari kernel:,
SIGCHLD
itu berarti bahwa salah satu proses anaknya keluar, terganggu atau dilanjutkan setelah terganggu (dalam kasus kami hanya keluar).Proses induk sekarang perlu menjalankan
wait()
syscall untuk membaca status keluar dan informasi lain dari proses anaknya. Kemudian deskriptor dihapus dari memori dan prosesnya bukan lagi zombie.Jika proses induk tidak pernah memanggil
wait()
syscall, deskriptor proses zombie tetap ada dalam memori dan makan otak. Biasanya Anda tidak melihat proses zombie, karena prosedur di atas memakan waktu lebih sedikit.Fajar orang mati
Setiap deskriptor proses membutuhkan jumlah memori yang sangat kecil, sehingga beberapa zombie tidak terlalu berbahaya (seperti dalam kehidupan nyata). Satu masalah adalah bahwa setiap proses zombie menyimpan id prosesnya, dan sistem operasi Linux / Unix memiliki jumlah pid yang terbatas. Jika perangkat lunak yang tidak terprogram menghasilkan banyak proses zombie, dapat terjadi bahwa proses tidak dapat dimulai lagi karena tidak ada lagi id proses yang tersedia.
Jadi, jika mereka berada dalam kelompok besar mereka sangat berbahaya (seperti di banyak film dipertunjukkan dengan sangat baik)
Bagaimana kita bisa mempertahankan diri melawan gerombolan zombie?
Tembakan di kepala akan berhasil, tetapi saya tidak tahu perintah untuk itu (SIGKILL tidak akan bekerja karena prosesnya sudah mati).
Nah, Anda dapat mengirim SIGCHLD via kill ke proses induk, tetapi ketika mengabaikan sinyal ini, lalu bagaimana? Satu-satunya pilihan Anda adalah untuk membunuh proses induk dan bahwa proses init "mengadopsi" zombie. Init secara berkala memanggil
wait()
syscall untuk membersihkan anak-anak zombie-nya.Dalam kasus Anda
Dalam kasus Anda, Anda harus mengirim SIGCHLD ke proses crond:
Kemudian dari terminal lain:
Outputnya adalah:
Anda melihat
wait4()
syscall mengembalikan -1 ECHILD, yang berarti bahwa tidak ada proses anak di sana. Jadi kesimpulannya adalah: cron bereaksi terhadap panggilan SIGCHLD dan tidak boleh memaksakan kiamat.sumber
Jika utas orang tua terbunuh sebelum utas anak, semua utas anak akan menjadi proses zombie.
sumber