Hari orang mati akan datang dan itulah sebabnya kami ingin melakukan tutorial kecil ini dari LxA untuk membincangkan mengenai proses zombie dan bagaimana kita boleh membunuh mereka. Perkara pertama yang perlu diperkatakan ialah proses zombie, dan seperti yang anda ketahui, kernel Linux mempunyai subsistem untuk menguruskan proses dan bekerja dengan penjadual untuk membuat, mengubah keutamaan, menghantar atau membuang aliran pemprosesan CPU dan proses membunuh. Nah, bahagian kernel ini, seperti sistem seperti Unix yang lain, membezakan antara pelbagai keadaan proses ...
Oleh itu, kita dapat menjumpainya satu proses ia boleh dalam keadaan tidur (S), iaitu tidur. Juga proses dalam keadaan berjalan (R) yang sedang berjalan atau berjalan, proses menunggu (D) yang dihentikan menunggu untuk dihadiri, isyarat (T) atau ditangguhkan, dan juga zombie (Z) atau si mati. Proses zombie atau mati adalah proses yang telah berjaya dihentikan, tetapi sumber daya sistem tertentu telah dirampas kerana Linux masih menyimpannya dalam jadual proses. Anda sudah tahu bahawa ketika proses berakhir, proses ini tidak seharusnya tetap dalam keadaan ini, tetapi prosesnya selesai dan kernel membebaskan sumber sehingga proses lain dapat menggunakannya, pada dasarnya ia membebaskan RAM yang ditempati ...
Oleh kerana tidak menarik untuk menjalani proses zombie jenis ini, walaupun tidak begitu kerap, kita dapat mencari dan menghilangkannya seperti yang ditunjukkan di sini. Perkara pertama adalah mencari apakah terdapat proses zombie di distro kami dan untuk itu kami dapat menolong diri sendiri alat seperti bahagian atas atau seperti ps. Sebagai contoh, salah satu daripada dua pilihan ini:
ps -el | grep 'Z' ps aux | grep defunct
Dan setelah dikesan, kita boleh bunuh dia secara langsung dengan:
kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`
Walaupun alternatif lain adalah mencari proses induk, sejak membunuh proses zombie Anda harus membunuh proses induk yang mengekalkannya, seperti yang mungkin anda simpulkan:
ps -eo pid,ppid | grep <PID> kill -9 <PPID>
Anda perlu menggantikan dengan ID proses zombie yang anda temukan dan untuk membunuhnya dengan kill, gunakan ID proses induk menggantikan dalam contoh, jelas.
Laman web yang baik!
Mereka sentiasa mengeluarkan kita daripada masalah.
Di mana mengatakan:
Walaupun alternatif lain ialah mencari proses induk, kerana untuk membunuh proses zombi anda perlu membunuh proses induk yang menyokongnya, seperti yang anda mungkin telah simpulkan:
1 | ps -eo pid, ppid | grep
2|
3 | bunuh -9
Anda perlu menggantikan ID proses zombi yang telah anda temui dan untuk membunuhnya dengan membunuh, gunakan ID proses induk yang menggantikan dalam contoh, jelas.
anda boleh menambah skrip:
$ kucing killppid.sh
#! / Bin / Bash
bunuh -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')
Sudah tentu, ia bukan tugas yang dilakukan oleh pengguna biasa sepanjang masa.
Ia hanya berguna untuk pentadbir, tetapi berbahaya untuk menjalankannya sebagai root, kerana sebarang proses pada sistem boleh dibunuh.
Dalam pembunuhan manusia ia mempunyai nota ini:
NOTA Cangkang anda (jurubahasa baris perintah) mungkin mempunyai perintah bunuh terbina dalam. Anda boleh
perlu menjalankan arahan yang diterangkan di sini sebagai / bin / kill untuk menyelesaikan konflik.
Bash mempunyai perintah itu, ini adalah bahagian man bash mengenainya:
bunuh [-s sigspec | -n tandatangan | -sigspec] [pid | jobspec] ...
bunuh -l | -L [sigspec | exit_status]
Hantar isyarat yang dinamakan oleh sigspec atau signum kepada proses yang dinamakan oleh pid atau kerja
spek. sigspec ialah sama ada nama isyarat tidak peka huruf besar-besaran seperti SIGKILL (dengan atau
tanpa awalan SIG) atau nombor isyarat; signum ialah nombor isyarat. Jika
sigspec tidak hadir, maka SIGTERM diandaikan. Hujah -l menyenaraikan
nama isyarat. Jika sebarang hujah dibekalkan apabila -l diberikan, nama bagi
isyarat yang sepadan dengan hujah disenaraikan, dan status pulangan ialah 0.
Argumen exit_status kepada -l ialah nombor yang menentukan sama ada nombor isyarat atau
status keluar dari proses yang ditamatkan oleh isyarat. Pilihan -L adalah bersamaan
dipinjamkan kepada -l. kill kembali benar jika sekurang-kurangnya satu isyarat berjaya dihantar, atau
palsu jika ralat berlaku atau pilihan yang tidak sah ditemui.
Pada mulanya mereka menerangkan bagaimana bash melindungi proses, untuk mengelakkan beberapa masalah, tetapi tidak jelas kepada saya bagaimana saya boleh membuat skrip selamat untuk dijalankan sebagai root.
Satu-satunya perkara yang boleh saya fikirkan adalah untuk melindunginya seperti ini:
$ kucing killppid.sh
#! / Bin / Bash
jika [$ PENGGUNA == "root"]
kemudian echo Jangan jalankan $ 0 sebagai root !!! ia berbahaya!
keluar
fi
bunuh -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')
$
Gunakan bash's kill, bukan / bin / kill
Bagaimana anda boleh melihat saya tidak begitu mahir dalam bash.
Adakah anda tahu cara menulis skrip selamat yang berjalan sebagai pengguna proses anak, walaupun ia berjalan sebagai root?
sesuatu yang setara dengan apa yang akan dilakukan secara manual seperti ini:
$ su;
$ bunuh -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $ 2}')