Qual è il modo migliore per ripulire dopo una bomba?


21
$ ls
bash: no more processes

Uh Oh. Sembra che qualcuno abbia fatto una bomba a forcella. Nel luogo in cui lavoravo in precedenza, ciò significava che il server condiviso avrebbe dovuto essere sottoposto a un ciclo di accensione e spegnimento, poiché spesso anche i amministratori di sistema con root non riuscivano a risolvere il problema. Spesso, non potevano nemmeno ricevere un prompt.

Ho sentito alcuni trucchi (in particolare, per inviare segnali STOP piuttosto che segnali KILL, poiché quest'ultimo consentirebbe ai thread rimanenti di sostituire immediatamente quelli uccisi), ma non ho mai visto una guida completa intitolata So, You Have Yourself una bomba a forcella?

Facciamo uno.

Risposte:


10

Impedire alla bomba a forcella di esaurire il limite di processo con un limite di processo ragionevole per utente utilizzando ulimit .

In questo modo, un singolo utente esaurirà la propria quota di processo molto prima che venga raggiunto il limite di sistema.


6

La prima cosa da provare sarebbe di ottenere gli utenti che hanno effettuato l'accesso per disconnettersi. È possibile che la loro shell possa essere il processo principale del processo che esegue tutto il fork e che potrebbe porre fine al problema.

Se non funziona, puoi provare a eseguire kill -STOP -2come root per bloccare tutti i processi in esecuzione come qualsiasi altro utente diverso da root. Se funziona, puoi quindi utilizzare kill -CONT <pid>per sbloccare alcuni processi noti non correlati alla bomba a forcella e ucciderli per eliminare l'intero problema della tabella dei processi e darti un po 'di respiro per rintracciare e uccidere la fonte originale del problema. Sendmail sarebbe un buon esempio di un processo di sistema da uccidere in quanto sarebbe facile identificarlo usando il file .pid per identificare il pid. Ad esempio kill -CONT $(< /var/run/sendmail.pid); kill $(< /var/run/sendmail.pid),.


Quale sistema operativo vedi un'opzione "-2" per kill? Non lo vedo nella pagina man su Linux.
Raldi,

1
Questo dovrebbe funzionare nella maggior parte dei SO in quanto si specifica un valore negativo per il pid. Se <pid> è inferiore a -1, kill viene inviato a tutti i processi nel gruppo di processi - <pid>. L'invio di un sig di STOP al pid -2 dovrebbe arrestare tutti i processi che non sono processi di sistema speciali o processi di proprietà root.

Vedi la manpage kill (2) per aver ucciso un "pid negativo", ma non credo ancora che funzioni. Perché tutti i processi non-init dovrebbero essere nel gruppo 2? Capisco che ti piacerebbe evitare init, dal momento che i risultati della sua interruzione sono spesso fatali, ma ...
effimero

@ephemient, 2 è troppo basso per essere un ID del gruppo di processi, quindi forse è un altro valore speciale.
joshudson,


3

Non sono sicuro di come sia possibile inviare un segnale di STOP, poiché la generazione killrichiederebbe un handle di processo disponibile. Inoltre, nella mia esperienza, i sistemi diventano sovraccarichi e inutilizzabili molto prima di esaurire i processi.

Hai considerato semplicemente l'applicazione di limiti di processo per utente con ulimit? Ciò impedirebbe agli utenti di lanciare bombe a forcella (accidentalmente o no).


3
kill è una shell integrata, almeno in bash.
Raldi,

1
Penso che sia un componente chiave: identifica i builtin per la tua shell preferita.

2
Se non è un built-in puoi eseguire "exec kill PID", che non si biforca. Ma è rischioso poiché, se non funziona, potresti non essere in grado di ottenere un'altra shell. Pensalo come l'approccio di puntura d'ape all'amministrazione del sistema!
Stephen Darlington,

2

Alcuni sistemi BSD hanno la capacità di riservare gli ultimi 5 processi per root. Forse il tuo sistema ha questa capacità.


3
Come si configura effettivamente il sistema per farlo?
Nik Reiman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.