Quelle est la meilleure façon de nettoyer après une bombe à fourche?


21
$ ls
bash: no more processes

Euh oh. On dirait que quelqu'un a fabriqué une bombe à fourche. Là où j'avais l'habitude de travailler, cela signifiait à peu près que le serveur partagé devait être redémarré, car même les administrateurs système avec root ne pouvaient souvent pas résoudre le problème. Souvent, ils ne pouvaient même pas recevoir d'invite.

J'ai entendu quelques astuces (notamment pour envoyer des signaux STOP plutôt que des signaux KILL, car ces derniers permettraient aux threads restants de remplacer immédiatement ceux tués), mais je n'ai jamais vu de guide complet intitulé So, You Have Yourself une bombe à fourche?

Faisons-en un.

Réponses:


10

Empêchez la bombe à fourche d'épuiser la limite de processus avec une limite de processus raisonnable par utilisateur en utilisant ulimit .

De cette façon, un seul utilisateur épuisera son quota de processus bien avant que la limite du système ne soit atteinte.


6

La première chose à faire serait de convaincre les utilisateurs connectés de se déconnecter. Il est possible que leur shell soit le processus parent du processus faisant tout le forking et cela pourrait mettre fin au problème.

Si cela ne fonctionne pas, vous pouvez essayer de s'exécuter en kill -STOP -2tant que root pour geler tous les processus exécutés en tant qu'utilisateur autre que root. Si cela fonctionne, vous pouvez ensuite utiliser kill -CONT <pid>pour dégeler certains processus connus qui ne sont pas liés à la bombe de fourche et les tuer pour éliminer le problème de la table de processus complète et vous donner une marge de manœuvre pour rechercher et tuer la source d'origine du problème. Sendmail serait un bon exemple d'un processus système à tuer car il serait facile de l'identifier en utilisant le fichier .pid pour identifier le pid. Par exemple kill -CONT $(< /var/run/sendmail.pid); kill $(< /var/run/sendmail.pid),.


Quel OS voyez-vous une option "-2" pour tuer? Je ne le vois pas dans la page de manuel sur Linux.
raldi

1
Cela devrait fonctionner dans la plupart des systèmes d'exploitation, car vous spécifiez une valeur négative pour le pid. Si <pid> est inférieur à -1, alors kill est envoyé à chaque processus du groupe de processus - <pid>. L'envoi d'un sig de STOP au pid -2 devrait arrêter tous les processus qui ne sont pas des processus système spéciaux ou des processus appartenant à la racine.

Voir la page de manuel kill (2) pour tuer un "pid négatif", mais je ne crois toujours pas que cela fonctionne. Pourquoi tous les processus non init seraient-ils dans le groupe 2? Je comprends que vous aimeriez éviter l'init, car les résultats de son arrêt sont souvent assez fatals, mais ...
éphémère

@ephemient, 2 est trop faible pour être un identifiant de groupe de processus, donc c'est peut-être une autre valeur spéciale.
joshudson


3

Je ne sais pas comment vous pourriez même envoyer un signal STOP, car le frai killnécessiterait un descripteur de processus disponible. De plus, d'après mon expérience, les systèmes deviennent surchargés et inutilisables bien avant de manquer de processus.

Avez-vous envisagé de simplement appliquer les limites de processus par utilisateur avec ulimit? Cela empêcherait vos utilisateurs de lancer des bombes à fourche (accidentellement ou non).


3
kill est un shell intégré, au moins dans bash.
raldi

1
Je pense que c'est un élément clé - identifiez les éléments intégrés pour votre shell de choix.

2
Si ce n'est pas un intégré, vous pouvez exécuter "exec kill PID", qui ne se bifurque pas. Mais c'est risqué car si cela ne fonctionne pas, vous ne pourrez peut-être pas obtenir un autre shell. Considérez-le comme l'approche piquante de l'administration système!
Stephen Darlington

2

Certains systèmes BSD ont la possibilité de réserver les 5 derniers processus pour root. Peut-être que votre système a cette capacité.


3
Comment configurez-vous réellement le système pour ce faire?
Nik Reiman
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.