Program yang ditulis dengan buruk atau berkinerja buruk dapat pergi Proses zombie mengintai di dalam komputer linux Anda. Cari tahu bagaimana zombie dibuat, dan bagaimana Anda akhirnya bisa meletakkannya untuk beristirahat.
Bagaimana keadaan proses bekerja di Linux
Linux, tentu saja, harus melacak semua aplikasi dan daemon yang berjalan di komputer Anda. Salah satu cara ini adalah dengan mempertahankan tabel proses. Ini adalah daftar struktur dalam memori kernel. Setiap proses memiliki entri dalam daftar ini yang berisi beberapa informasi tentang itu.
Tidak ada banyak hal di setiap struktur tabel proses. Mereka memegang ID Proses. , beberapa item data lainnya, dan pointer ke blok kontrol proses (PCB) untuk proses itu.
Ini adalah PCB yang menampung banyak detail Linux perlu mencari atau diatur untuk setiap proses. PCB juga diperbarui karena proses dibuat, diberikan waktu pemrosesan, dan akhirnya hancur.
Linux PCB berisi lebih dari 95 bidang.
Ini didefinisikan
sebagai struktur yang disebut
task_struct.h.
, dan panjangnya lebih dari 700 baris. PCB berisi jenis informasi berikut:
- Keadaan proses : Negara-negara dijelaskan di bawah ini.
- Proses nomor : Pengidentifikasi unik dalam sistem operasi.
- Konter Program. : Ketika proses ini diberi akses ke CPU, sistem akan menggunakan alamat ini untuk menemukan instruksi selanjutnya dari proses yang harus dijalankan.
- Register. : Daftar register CPU yang digunakan oleh proses ini. Daftar mungkin berisi akumulator, register indeks, dan tumpukan pointer.
- Buka Daftar File : File yang terkait dengan proses ini.
- Informasi Penjadwalan CPU. : Digunakan untuk menentukan seberapa sering, dan untuk berapa lama, waktu pemrosesan CPU diberikan untuk proses ini. Prioritas proses, pointer untuk antrian penjadwalan, dan parameter penjadwalan lainnya harus direkam dalam PCB.
- Informasi Manajemen Memori : Rincian tentang memori proses ini menggunakan, seperti alamat awal dan akhir dari memori proses, dan pointer ke halaman memori.
- Informasi Status I / O : Setiap perangkat in-atau output yang digunakan oleh proses.
"Status proses" dapat berupa salah satu dari yang berikut:
- R: Proses berlari atau runnable. Berlari yang berarti menerima siklus CPU dan mengeksekusi. Proses yang runnable siap untuk dijalankan dan menunggu slot CPU.
- S: Proses tidur. Proses ini sedang menunggu tindakan untuk diselesaikan, seperti operasi in-or output, atau untuk sumber daya tersedia.
- D: Prosesnya dalam keadaan tidur yang tidak terputus. Ini menggunakan panggilan sistem pemblokiran dan tidak dapat melanjutkan sampai sistem panggilan selesai. Berbeda dengan negara "tidur", suatu proses dalam keadaan ini tidak akan merespons sinyal sampai panggilan sistem selesai dan eksekusi telah kembali ke proses.
-
T:
Proses telah berakhir (dihentikan) karena menerima
Sigstop.sinyal. Dia hanya akan merespons untukSigkillatauSIGCONT.Sinyal, yang dapat membunuh proses atau menginstruksinya untuk melanjutkan, masing-masing. Inilah yang terjadi ketika Anda bertukar latar depan (fg.) ke Latar Belakang (bg)tugas. -
Z:
Proses zombie. Ketika suatu proses selesai, itu tidak hanya lenyap. Ini membebaskan setiap memori yang digunakan dan menghapus dirinya dari memori, tetapi entri dalam tabel proses dan PCB tetap ada. Keadaannya diatur ke
Exit_Zombie., dan proses induknya diberitahukan (olehSigchld.sinyal) bahwa proses anak telah selesai.
Dalam keadaan zombie, proses induk memanggil salah satu
tunggu()
keluarga fungsi
ketika proses anak dibuat. Kemudian menunggu perubahan negara dalam proses anak. Apakah proses anak sudah dihentikan, dilanjutkan, atau dibunuh oleh sinyal? Apakah itu dihentikan dengan menjalankan penyelesaian kodenya?
Jika perubahan negara adalah salah satu yang berarti proses anak telah berhenti berjalan, kode keluarnya dibaca. Kemudian, PCB anak dihancurkan dan entri dalam tabel proses dihapus. Idealnya, ini semua terjadi dalam sekejap mata, dan proses dalam keadaan zombie tidak ada terlalu lama.
TERKAIT: Cara menjalankan dan mengontrol proses latar belakang di Linux
Apa yang menyebabkan proses zombie di Linux?
Proses induk yang ditulis dengan buruk mungkin tidak menelepon
tunggu()
berfungsi ketika proses anak dibuat. Ini berarti tidak ada yang mengawasi perubahan negara dalam proses anak, dan
Sigchld.
sinyal akan diabaikan. Atau, mungkin aplikasi lain mempengaruhi eksekusi proses induk, baik karena pemrograman yang buruk atau niat jahat.
Namun, jika proses induknya tidak menonton perubahan negara dalam proses anak, housekeeping sistem yang tepat tidak akan terjadi. PCB dan entri dalam tabel proses tidak akan dihapus ketika proses anak berakhir. Ini menghasilkan keadaan zombie tidak pernah dihapus dari PCB.
Zombies menggunakan sedikit memori, tetapi mereka biasanya tidak menimbulkan masalah. Entri dalam tabel proses kecil, tetapi, sampai dirilis, ID proses tidak dapat digunakan kembali. Pada sistem operasi 64-bit, itu tidak mungkin menyebabkan masalah apa pun karena PCB jauh lebih besar dari entri tabel proses.
Sejumlah besar zombie bisa, dapat dibayangkan, mempengaruhi jumlah memori yang gratis untuk proses lain. Jika Anda memiliki banyak zombie, Anda punya masalah serius dengan aplikasi induk atau bug sistem operasi.
Cara Menghapus Proses Zombie
Anda tidak dapat membunuh proses zombie karena sudah mati. Itu tidak akan menanggapi sinyal apa pun karena telah dihapus dari memori - tidak ada tempat untuk mengirim a
Sigkill
sinyal. Anda dapat mencoba mengirim
Sigchld.
sinyal ke proses induk, tetapi jika tidak berfungsi ketika proses anak dihentikan, itu tidak mungkin bekerja sekarang juga.
Satu-satunya solusi yang dapat diandalkan adalah membunuh proses induk. Ketika dihentikan, proses anaknya diwarisi oleh
init
Proses, yang merupakan proses pertama yang dijalankan dalam sistem Linux (ID prosesnya adalah 1).
NS
init
Proses secara teratur melakukan pembersihan zombie yang diperlukan, sehingga untuk membunuh mereka, Anda hanya perlu membunuh proses yang menciptakannya. NS
atas
Perintah adalah cara yang mudah untuk melihat apakah Anda memiliki zombie.
Ketikkan yang berikut:
atas
Sistem ini memiliki delapan proses zombie. Kita
dapat mendaftar ini
Dengan menggunakan
ps.
memerintah
dan menyalakannya
Egrep.
. Sekali lagi, proses zombie memiliki bendera negara "Z," dan Anda biasanya juga melihat "mati."
Ketikkan yang berikut:
PS AUX | egrep "z | defunt"
Proses zombie terdaftar.
Ini adalah cara yang lebih rapi untuk menemukan proses proses zombie daripada menggulir bolak-balik
atas
. Kami juga melihat bahwa aplikasi bernama "Badprg" melahirkan zombie ini.
ID proses zombie pertama adalah 7641, tetapi kita perlu menemukan proses id dari proses induknya. Kita dapat melakukannya dengan menggunakan
lagi. Kami akan menggunakan opsi output (
ps.
-Hai
) untuk memberi tahu
ps.
hanya menampilkan ID proses orangtua, dan kemudian meneruskannya dengan
ppid =
bendera.
Proses yang ingin kami temukan akan ditunjukkan dengan menggunakan
-P
opsi (proses), dan kemudian melewati ID proses zombie.
Oleh karena itu, kami mengetikkan perintah berikut untuk mencari informasi proses untuk proses 7641, tetapi hanya akan melaporkan ID proses induk:
PS -O PPID = -P 7641
Kami diberitahu bahwa ID proses induk adalah 7636. Kami sekarang dapat merujuk silang ini dengan menggunakan
ps.
sekali lagi.
Kami melihat ini cocok dengan nama proses induk dari sebelumnya. Untuk membunuh proses induk, gunakan opsi SIGKill dengan perintah kill sebagai berikut:
Bunuh -Sigkill 7636
Tergantung pada pemilik proses induk, Anda mungkin juga perlu menggunakannya
Sudo
.
Zombies tidak menakutkan ...
... kecuali mereka berada di gerombolan besar-besaran. Beberapa tidak perlu khawatir dan reboot sederhana akan menghapusnya.
Namun, jika Anda melihat bahwa aplikasi atau proses selalu memunculkan zombie, itu adalah sesuatu yang harus Anda perhatikan. Kemungkinan besar hanya program tertulis yang ceroboh, dalam hal ini, mungkin ada versi yang diperbarui yang dibersihkan dengan benar setelah proses anaknya.