Hari kematian akan datang dan itulah mengapa kami ingin melakukan tutorial kecil ini dari LxA untuk berbicara tentang proses zombie dan bagaimana kita bisa membunuh mereka. Hal pertama yang harus dikatakan adalah apa proses zombie itu, dan seperti yang Anda ketahui, kernel Linux memiliki subsistem untuk mengelola proses dan bekerja dengan penjadwal untuk membuat, memvariasikan prioritas, mengirim atau menghapus aliran pemrosesan CPU dan mematikan proses.. Nah, bagian kernel ini, seperti sistem mirip Unix lainnya, membedakan antara berbagai status proses ...
Jadi kita bisa menemukannya sebuah proses bisa dalam keadaan tidur (S), yaitu tertidur. Juga proses dalam keadaan berjalan (R) yaitu yang sedang aktif atau berjalan, proses menunggu (D) yang berhenti menunggu untuk dihadiri, gestpt (T) atau ditangguhkan, dan juga zombie (Z) atau almarhum. Proses zombie atau mati adalah salah satu yang telah berhasil dihentikan, tetapi memiliki sumber daya sistem tertentu yang dibajak karena Linux masih menyimpannya dalam tabel proses. Anda sudah tahu bahwa ketika suatu proses berakhir, seharusnya tidak tetap dalam keadaan ini, tetapi selesai dan kernel membebaskan sumber daya sehingga proses lain dapat menggunakannya, pada dasarnya ini membebaskan RAM yang ditempati ...
Yah, karena tidak menarik untuk memiliki jenis proses zombie ini, meskipun tidak terlalu sering, kita dapat mencari dan menghilangkannya seperti yang ditunjukkan di sini. Hal pertama adalah menemukan apakah ada proses zombie di distro kami dan untuk itu kami dapat membantu diri kami sendiri alat seperti top atau seperti ps. Misalnya, salah satu dari dua opsi ini:
ps -el | grep 'Z' ps aux | grep defunct
Dan begitu terdeteksi, kita bisa bunuh dia langsung dengan:
kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`
Meskipun alternatif lain adalah menemukan proses induk, sejak itu membunuh proses zombie Anda harus menghentikan proses induk yang menopangnya, seperti yang mungkin telah Anda simpulkan:
ps -eo pid,ppid | grep <PID> kill -9 <PPID>
Anda harus mengganti dengan ID dari proses zombie yang telah Anda temukan dan untuk membunuhnya dengan membunuh, gunakan ID dari proses induk menggantikan dalam contoh, tentu saja.
Situs yang bagus!
Mereka selalu membuat kita keluar dari masalah.
Dimana mengatakan:
Meskipun alternatif lain adalah menemukan proses induk, karena untuk mematikan proses zombie Anda harus mematikan proses induk yang mendukungnya, seperti yang mungkin telah Anda simpulkan:
1 | ps -eo pid, ppid | grep
2|
3 | bunuh -9
Anda harus mengganti ID proses zombie yang telah Anda temukan dan untuk membunuhnya dengan kill, gunakan ID proses induk yang menggantikan dalam contoh, jelas.
Anda dapat menambahkan skrip:
$ kucing killppid.sh
#! / bin / bash
kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $2}')
Tentu saja, ini bukan tugas yang dilakukan pengguna biasa sepanjang waktu.
Ini hanya akan berguna bagi administrator, tetapi berbahaya untuk menjalankannya sebagai root, karena dapat mematikan proses apa pun di sistem.
Dalam man kill memiliki catatan ini:
CATATAN Shell Anda (penerjemah baris perintah) mungkin memiliki perintah kill bawaan. Kamu boleh
perlu menjalankan perintah yang dijelaskan di sini sebagai / bin / kill untuk menyelesaikan konflik.
Bash memiliki perintah itu, ini adalah bagian dari man bash tentangnya:
bunuh [-s sigspec | -n tanda | -sigspec] [pid | spesifikasi pekerjaan] ...
kill -l | -L [sigspec | status_keluar]
Kirim sinyal yang diberi nama oleh sigspec atau signum ke proses yang diberi nama oleh pid atau job
spesifikasi sigspec adalah nama sinyal case-insensitive seperti SIGKILL (dengan or
tanpa awalan SIG) atau nomor sinyal; signum adalah nomor sinyal. Jika
sigspec tidak ada, maka SIGTERM diasumsikan. Argumen -l mencantumkan
nama sinyal. Jika ada argumen yang diberikan ketika -l diberikan, nama-nama dari
sinyal yang sesuai dengan argumen terdaftar, dan status pengembaliannya adalah 0.
Argumen exit_status ke -l adalah angka yang menentukan nomor sinyal atau
status keluar dari proses yang dihentikan oleh sinyal. Opsi -L setara
dipinjamkan ke -l. kill mengembalikan true jika setidaknya satu sinyal berhasil dikirim, atau
false jika terjadi kesalahan atau ditemukan opsi yang tidak valid.
Pada awalnya mereka menjelaskan bagaimana bash melindungi proses, untuk menghindari beberapa masalah, tetapi tidak jelas bagi saya bagaimana saya bisa membuat skrip yang aman untuk dijalankan sebagai root.
Satu-satunya hal yang dapat saya pikirkan adalah melindunginya seperti ini:
$ kucing killppid.sh
#! / bin / bash
jika [$ PENGGUNA == "root"]
lalu echo Jangan jalankan $ 0 sebagai root !!! itu berbahaya!
keluar
fi
kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $2}')
$
Gunakan bash's kill, bukan / bin / kill
Bagaimana Anda bisa melihat saya tidak fasih dalam bash.
Apakah Anda tahu cara menulis skrip aman yang berjalan sebagai pengguna proses anak, meskipun berjalan sebagai root?
sesuatu yang setara dengan apa yang akan dilakukan secara manual seperti ini:
$su;
$ kill -9 $ (ps -eo pid, ppid | awk '$ 1 ==' $ {1} '{print $2}')