
Fatmawati Achmad Zaenuri / Shutterstock
Program yang ditulis dengan buruk atau berprestasi buruk boleh menyebabkan proses zombi bersembunyi pada komputer Linux anda. Ketahui cara zombi dicipta dan bagaimana anda akhirnya boleh menamatkannya.
Bagaimana keadaan proses berfungsi dalam Linux
Linux, sudah tentu, perlu menjejaki semua aplikasi dan daemon yang berjalan pada komputer anda. Salah satu cara ia melakukan ini adalah untuk mengekalkan jadual proses. Ini ialah senarai struktur dalam memori kernel. Setiap proses mempunyai entri dalam senarai ini yang mengandungi maklumat mengenainya.
Tidak banyak dalam setiap struktur jadual proses. Mereka mempunyai Pengenalpastian proses , beberapa elemen data lain dan penunjuk kepada blok kawalan proses (PCB) untuk proses tersebut.
Ia adalah PCB yang mengandungi banyak butiran yang mesti dicari atau dikonfigurasi oleh Linux untuk setiap proses. PCB juga dikemas kini apabila proses dicipta, memandangkan masa pemprosesan, dan akhirnya dimusnahkan.
PCB Linux mengandungi lebih daripada 95 medan. Ia ditakrifkan sebagai struktur bernama |__+_|, dan mempunyai lebih daripada 700 baris. PCB mengandungi jenis maklumat berikut:
'Status proses' boleh menjadi salah satu daripada yang berikut:
Dalam keadaan Zombie, proses induk memanggil salah satu fail |_+_| keluarga berfungsi apabila proses kanak-kanak dibuat. Ia kemudian menunggu perubahan keadaan dalam proses anak. Adakah proses kanak-kanak terganggu, diteruskan atau digugurkan oleh isyarat? Adakah anda selesai melengkapkan kod anda secara semula jadi?
Jika perubahan keadaan menunjukkan bahawa proses anak telah berhenti berjalan, kod keluarnya dibaca. PCB kanak-kanak itu kemudiannya dimusnahkan dan kemasukannya dalam jadual proses dikeluarkan. Sebaik-baiknya, semua ini berlaku dalam sekelip mata, dan proses dalam keadaan zombie tidak wujud untuk masa yang lama.
BERKAITAN: Bagaimana untuk menjalankan dan mengawal proses latar belakang dalam Linux
Apakah yang menyebabkan proses zombi di Linux?
Ada kemungkinan proses utama yang ditulis dengan teruk tidak memanggil fail |_+_| apabila proses kanak-kanak dibuat. Ini bermakna tiada apa yang melihat perubahan keadaan dalam proses anak dan fail. |_+_| isyarat akan diabaikan. Atau mungkin aplikasi lain menjejaskan pelaksanaan proses utama, disebabkan pengaturcaraan yang buruk atau niat jahat.
Walau bagaimanapun, jika proses induk tidak melihat perubahan keadaan dalam proses anak, penyelenggaraan sistem yang betul tidak akan berlaku. PCB dan entri dalam jadual proses tidak akan dialih keluar apabila proses anak tamat. Ini memastikan bahawa keadaan zombi tidak pernah dikeluarkan daripada PCB.
Zombi menggunakan sedikit ingatan, tetapi secara amnya tidak menjadi masalah. Entri dalam jadual proses adalah kecil, tetapi sehingga ia dikeluarkan, ID proses tidak boleh digunakan semula. Pada OS 64-bit, ini tidak mungkin menyebabkan sebarang masalah kerana PCB jauh lebih besar daripada kemasukan jadual proses.
Sebilangan besar zombi mungkin boleh menjejaskan jumlah memori percuma untuk proses lain. Walau bagaimanapun, jika anda mempunyai begitu banyak zombi, anda mempunyai masalah serius dengan aplikasi utama atau pepijat sistem pengendalian.
Bagaimana untuk membunuh proses zombi
Anda tidak boleh membunuh proses zombi kerana ia sudah mati. Ia tidak akan bertindak balas kepada sebarang isyarat kerana ia telah dialih keluar daripada ingatan; tiada tempat untuk menghantar fail. |_+_| tanda. Anda boleh cuba menghantar fail |__+_| memberi isyarat kepada proses induk, tetapi jika proses itu tidak berfungsi apabila proses anak keluar, proses itu tidak mungkin berfungsi walaupun sekarang.
Satu-satunya penyelesaian yang boleh dipercayai adalah untuk membunuh proses induk. Apabila ditamatkan, proses anaknya mewarisi daripada |__+_| proses, yang merupakan proses pertama yang dijalankan pada sistem Linux (ID prosesnya ialah 1).
yang |_+_| Proses ini kerap melakukan pembersihan zombi yang diperlukan, jadi untuk membunuh mereka, anda hanya perlu membunuh proses yang menciptanya. yang |_+_| Perintah adalah cara yang mudah untuk melihat sama ada anda mempunyai zombi.
Taip yang berikut:
|_+_|
Sistem ini mempunyai lapan proses zombi. Kami anda boleh menyenaraikannya menggunakan |_+_| saya hantar dan menyampaikannya |_+_|. Sekali lagi, ujian zombi mempunyai bendera status 'Z' dan anda biasanya akan melihat 'mati' juga.
Taip yang berikut:
|_+_|
Proses zombi disenaraikan.
Ini adalah cara yang lebih kemas untuk mengetahui ID proses zombi daripada menatal ke depan dan ke belakang |_+_|. Kami juga melihat bahawa aplikasi yang dipanggil 'badprg' melahirkan zombi ini.
ID proses zombi pertama ialah 7641, tetapi kita perlu mencari ID proses proses induknya. Kita boleh melakukan ini menggunakan |__+_|belum lagi. Kami akan menggunakan pilihan output (|_+_|) untuk menyebut |_+_| untuk memaparkan hanya ID proses induk, kemudian luluskannya dengan |__+_| bendera.
Proses yang ingin kami cari akan ditunjukkan oleh |__+_| (proses), kemudian lulus ID proses zombi.
Oleh itu, kami menaip perintah berikut untuk mengambil maklumat proses untuk proses 7641, tetapi ia hanya akan melaporkan ID proses induk:
|_+_|
Kami diberitahu bahawa ID proses induk ialah 7636. Kini kami boleh merujuk silang menggunakan |__+_| Sekali lagi.
Kami melihat bahawa ini sepadan dengan nama proses induk di atas. Untuk membunuh proses induk, gunakan pilihan SIGKILL dengan perintah bunuh seperti berikut:
|_+_|Bergantung pada pemilik proses induk, anda juga mungkin perlu menggunakan |_+_|.
Zombi tidak menakutkan...
... melainkan mereka berada dalam gerombolan yang besar. Sesetengahnya tidak perlu dibimbangkan dan but semula mudah akan memadamkannya.
Walau bagaimanapun, jika anda melihat apl atau proses yang sentiasa melahirkan zombi, itu adalah sesuatu yang perlu dilihat. Kemungkinan besar ia hanyalah program yang ditulis secara selamba, yang mana mungkin terdapat versi yang dikemas kini yang dibersihkan dengan betul selepas proses kanak-kanak.
Apa pendapat kamu?