¿Cuál es la mejor manera de limpiar después de una bomba tenedor?

21
$ ls
bash: no more processes

UH oh. Parece que alguien hizo una bomba tenedor. Donde solía trabajar, esto significaba que el servidor compartido necesitaría un ciclo de encendido, ya que incluso los administradores de sistemas con root a menudo no podían solucionar el problema. A menudo, ni siquiera podían recibir un aviso.

He escuchado algunos trucos (en particular, para enviar señales de STOP en lugar de señales de KILL, ya que este último permitiría que los hilos restantes reemplacen inmediatamente a los muertos), pero nunca he visto una guía completa titulada So, You Have Yourself una bomba tenedor?

Hagamos uno.

raldi
fuente

Respuestas:

10

Evite que la bomba tenedor agote el límite del proceso con un límite de proceso razonable por usuario utilizando ulimit .

De esa manera, un solo usuario agotará su cuota de proceso mucho antes de que se alcance el límite del sistema.

Chris Smith
fuente
6

Lo primero que debe intentar sería lograr que los usuarios que están conectados inicien sesión. Es posible que su caparazón sea el proceso principal del proceso que realiza toda la bifurcación y eso podría terminar con el problema.

Si eso no funciona, puede intentar ejecutar kill -STOP -2como root para congelar todos los procesos que se ejecutan como cualquier otro usuario que no sea root. Si eso funciona, puede usar kill -CONT <pid>para descongelar algunos procesos conocidos que no están relacionados con la bomba tenedor y matarlos para eliminar el problema de la tabla de procesos completa y darle un respiro para localizar y eliminar la fuente original del problema. Sendmail sería un buen ejemplo de un proceso del sistema para matar, ya que sería fácil de identificar utilizando el archivo .pid para identificar el pid. Por ejemplo, kill -CONT $(< /var/run/sendmail.pid); kill $(< /var/run/sendmail.pid).


fuente
¿Qué sistema operativo ves una opción "-2" para matar? No lo veo en la página del manual en Linux.
raldi
1
Esto debería funcionar en la mayoría de los sistemas operativos ya que está especificando un valor negativo para el pid. Si <pid> es menor que -1, se envía kill a cada proceso en el grupo de procesos - <pid>. Al enviar un signo de STOP al pid -2, debe detener todos los procesos que no son procesos especiales del sistema o procesos de propiedad raíz.
Vea la página de manual kill (2) para matar un "pid negativo", pero todavía no creo que esto funcione. ¿Por qué todos los procesos que no son init están en el grupo 2? Entiendo que desea evitar el inicio, ya que los resultados de detener a menudo son bastante fatal, pero ...
ephemient
@ephemient, 2 es demasiado bajo para ser una identificación de grupo de proceso, por lo que tal vez sea otro valor especial.
joshudson
@Joshua No hay valores especiales al lado 0y -1, de acuerdo con opengroup.org/onlinepubs/009695399/functions/kill.html opengroup.org/onlinepubs/000095399/utilities/kill.html
ephemient
3

No estoy seguro de cómo podría incluso enviar una señal de DETENCIÓN, desde el desove kill requeriría un controlador de proceso disponible. Además, en mi experiencia, los sistemas se sobrecargan y se vuelven inutilizables mucho antes de quedarse sin procesos.

¿Ha considerado simplemente imponer límites de proceso por usuario ulimit? Eso evitaría que sus usuarios lancen bombas de horquilla (accidentalmente o no).

John Millikin
fuente
3
kill es un shell incorporado, al menos en bash.
raldi
1
Creo que es un componente clave: identifique los componentes incorporados para su caparazón de elección.
2
Si no está integrado, puede ejecutar "exec kill PID", que no se bifurca. Pero es arriesgado ya que, si no funciona, es posible que no pueda obtener otro shell. ¡Piense en ello como el enfoque punzante de la administración del sistema!
Stephen Darlington
2

Algunos sistemas BSD tienen la capacidad de reservar los últimos 5 procesos para la raíz. Quizás tu sistema tenga esa habilidad.

joshudson
fuente
3
¿Cómo se configura realmente el sistema para hacer esto?
Nik Reiman