Bagaimana untuk membunuh proses zombi di Linux


Tetingkap terminal pada komputer riba Linux.

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:

    Keadaan proses: Negeri-negeri diterangkan di bawah. nombor proses: Pengecam unik anda dalam sistem pengendalian. kaunter program: Apabila proses ini diberikan akses CPU seterusnya, sistem akan menggunakan alamat ini untuk mencari arahan seterusnya proses untuk dilaksanakan. Rekod: Senarai daftar CPU yang digunakan oleh proses ini. Senarai itu boleh mengandungi penumpuk, daftar indeks dan penuding tindanan. buka senarai fail: Fail yang dikaitkan dengan proses ini. Maklumat jadual CPU: Digunakan untuk menentukan kekerapan dan tempoh masa pemprosesan CPU yang diperuntukkan untuk proses ini. Keutamaan proses, bendera baris gilir penjadualan dan parameter penjadualan lain mesti direkodkan pada PCB. Maklumat mengenai pengurusan ingatan: Butiran tentang memori yang digunakan oleh proses ini, seperti alamat mula dan akhir memori proses dan penunjuk ke halaman memori. Maklumat status I/O: Sebarang peranti input atau output yang digunakan oleh proses.

'Status proses' boleh menjadi salah satu daripada yang berikut:

    R:Proses berjalan atau boleh dilaksanakan. Berjalan bermakna ia mendapat kitaran CPU dan ia berfungsi. Proses boleh laku sedia untuk dijalankan dan menunggu slot CPU. S:Satu proses impian. Proses sedang menunggu tindakan untuk diselesaikan, seperti operasi input atau output, atau untuk sumber tersedia. RE:Proses berada dalam keadaan tidur tanpa gangguan. Ia menggunakan panggilan sistem menyekat dan tidak boleh meneruskan sehingga panggilan sistem selesai. Tidak seperti keadaan 'tidur', proses dalam keadaan ini tidak akan bertindak balas kepada isyarat sehingga panggilan sistem selesai dan pelaksanaan telah kembali kepada proses. T:Proses ditamatkan (dibatalkan) kerana ia menerima sambungan |_+_| tanda. ia adalah Saya hanya akan menjawab kepada |_+_| atau |_+_| isyarat, yang mengganggu proses atau memberitahunya untuk meneruskan, masing-masing. Inilah yang berlaku apabila anda berubah tingkat satu (|_+_|) untuk latar belakang (|_+_| kerja rumah. DENGAN:Kuiz zombi. Apabila proses selesai, ia tidak hilang. Ia membebaskan semua memori yang digunakan dan mengeluarkan dirinya daripada ingatan, tetapi kemasukan PCB dan jadual prosesnya kekal. Keadaannya ditetapkan kepada |__+_| dan proses induknya menerima pemberitahuan (isyarat |_+_|) bahawa proses anak telah ditamatkan.

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:

|_+_|

di bahagian atas tetingkap terminal

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:

|_+_|

ps kepada | bangau

Proses zombi disenaraikan.

Keluar ps aux | bangau

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:

|_+_|

ps -o ppid = -p 7641 dalam tetingkap terminal

Kami diberitahu bahawa ID proses induk ialah 7636. Kini kami boleh merujuk silang menggunakan |__+_| Sekali lagi.

ps -e | grep 7636 dalam tetingkap terminal

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?