Apa cara terbaik untuk membersihkan setelah bom garpu?

21
$ ls
bash: no more processes

Uh oh. Sepertinya seseorang membuat bom fork. Di tempat saya dulu bekerja, ini cukup berarti bahwa server bersama perlu power-cycled, karena bahkan sysadmin dengan root sering tidak dapat menyelesaikan masalah. Seringkali, mereka bahkan tidak bisa mendapatkan prompt.

Saya telah mendengar beberapa trik (terutama, untuk mengirim sinyal STOP daripada sinyal KILL, karena yang terakhir akan memungkinkan utas yang tersisa untuk segera mengganti yang terbunuh), tetapi saya belum pernah melihat panduan komprehensif berjudul So, You Have Yourself sebuah Fork Fork?

Mari kita membuatnya.

raldi
sumber

Jawaban:

10

Cegah bom fork melelahkan batas proses dengan batas wajar per proses pengguna menggunakan ulimit .

Dengan begitu, satu pengguna akan menghabiskan kuota proses mereka jauh sebelum batas sistem tercapai.

Chris Smith
sumber
6

Hal pertama yang harus dicoba adalah membuat pengguna yang masuk logout. Mungkin shell mereka adalah proses induk dari proses melakukan semua percabangan dan yang mungkin mengakhiri masalah.

Jika itu tidak berhasil, Anda bisa mencoba menjalankan kill -STOP -2sebagai root untuk membekukan semua proses yang berjalan sebagai pengguna selain dari root. Jika berhasil, Anda dapat menggunakannya kill -CONT <pid>untuk mencairkan beberapa proses yang diketahui yang tidak terkait dengan bom garpu dan membunuh mereka untuk menghilangkan masalah tabel proses penuh dan memberi Anda ruang bernapas untuk melacak dan membunuh sumber asli masalah. Sendmail akan menjadi contoh yang baik dari proses sistem untuk dimatikan karena akan mudah diidentifikasi dengan menggunakan file .pid untuk mengidentifikasi pid. Sebagai contoh kill -CONT $(< /var/run/sendmail.pid); kill $(< /var/run/sendmail.pid),.


sumber
OS apa yang Anda lihat opsi "-2" untuk membunuh? Saya tidak melihatnya di halaman manual di Linux.
raldi
1
Ini harus bekerja di sebagian besar OS karena Anda menentukan nilai negatif untuk pid. Jika <pid> kurang dari -1, maka kill dikirim ke setiap proses dalam grup proses - <pid>. Mengirim sig STOP ke pid -2 harus menghentikan semua proses yang bukan proses sistem khusus atau proses yang dimiliki root.
Lihat halaman manual kill (2) karena membunuh "pid negatif", tetapi saya masih tidak percaya ini berhasil. Mengapa semua proses non-init berada di grup 2? Saya mengerti bahwa Anda ingin menghindari init, karena hasil menghentikannya seringkali cukup fatal, tapi ...
ephemient
@ephemient, 2 terlalu rendah untuk menjadi id grup proses jadi mungkin itu nilai khusus lain.
joshudson
3

Tidak yakin bagaimana Anda bahkan dapat mengirim sinyal STOP, karena pemijahan killakan membutuhkan pegangan proses yang tersedia. Selain itu, dalam pengalaman saya sistem menjadi kelebihan beban dan tidak dapat digunakan lama sebelum kehabisan proses.

Sudahkah Anda mempertimbangkan untuk hanya menerapkan batas proses per pengguna ulimit? Itu akan mencegah pengguna Anda meluncurkan bom fork (tidak sengaja atau tidak).

John Millikin
sumber
3
kill adalah sebuah shell bawaan, setidaknya dalam bash.
raldi
1
Saya pikir itu adalah komponen kunci - identifikasi builtin untuk shell pilihan Anda.
2
Jika ini bukan built-in, Anda dapat menjalankan "exec kill PID", yang tidak bercabang. Tapi itu berisiko karena, jika tidak berhasil, Anda mungkin tidak bisa mendapatkan shell lain. Anggap saja sebagai pendekatan sengatan terhadap administrasi sistem!
Stephen Darlington
2

Beberapa sistem BSD memiliki kemampuan untuk memesan 5 proses root terakhir. Mungkin sistem Anda memiliki kemampuan itu.

joshudson
sumber
3
Bagaimana Anda benar-benar mengkonfigurasi sistem untuk melakukan ini?
Nik Reiman