Comment « while (sommeil et 100!) Faire; fait » travailler dans zsh, et comment pourrait-il être reproduit dans bash?

StackOverflow https://stackoverflow.com/questions/574695

  •  05-09-2019
  •  | 
  •  

Question

Selon Wikipedia , le :(){ :|:& };: de forkbomb peut être arrêté avec la commande zsh while (sleep 100 &!) do; done, qui sera soi-disant frayer 100 processus de sommeil jusqu'à ce que tous les processus de forkbomb sont partis. Cela semble comme par magie; Comment ça marche? Je suis particulièrement curieux de savoir exactement ce que « &! » des moyens.

Qu'est-ce que une commande équivalente ressemblera dans bash?

Était-ce utile?

La solution

La raison pour laquelle fonctionne un bombe à fourche est parce qu'il ya une limite finie au nombre de processus qui peuvent être en cours d'exécution à un moment donné, et une bombe à fourche est conçu pour combler cette limite.

Parce que le code forkbomb vous avez fourni meurt si elle ne peut pas créer un processus enfant, les processus parents ne traînent pas vraiment autour, mais le fait que les enfants continuent à créer de nouveaux -enfants grands * conserve la table de processus complet.

Donc, la solution de sommeil est conçu pour se faufiler dans certains processus qui dorment seulement pour une courte période de temps, et pour chaque processus de sommeil qui parvient à créer, il y a moins de fourche bombes qui se produisent. Finalement, les processus de sommeil remplissent la table et les procès- eux-mêmes des bombes à fourche meurent.

Une fois que la table de processus traite le sommeil complet de la boucle while peut être tué, et les processus du sommeil va mourir une fois leur temps de sommeil est écoulé. Problem solved .

Comme on l'a déjà mentionné la partie importante de la commande zsh est le & exécution en arrière-plan, de sorte que la commande bash serait essentiellement la même que celle donnée dans les autres réponses:

while (sleep 100 &) do; done

Je ne pense pas que la nohup / partie ! est important, sauf si vous voulez vous déconnecter dans le temps de sommeil, mais je serais heureux de détromper si je me trompe.

Autres conseils

D'abord la bombe fourche peut être écrit:

foo()
{
    foo|foo&
}
foo

Ce qui le rend un peu plus clair - chaque itération commence deux sous-processus, puis meurt. Donc, si le fork échoue, il ne se bloque pas autour.

Par conséquent, tout ce que nous avons à faire est de faire bifurquer l'échec temporairement. Nous créons ainsi des processus qui dorment 100 et occupent l'espace de processus, les processus du sommeil font.

Le zsh &! est comme & mais désavoue le nouveau processus (ne tue pas à la fermeture de session) - il est probablement pas important dans cet exemple. ( manuel) Il peut être remplacé par nohup.

Par conséquent, le bash:

while (nohup sleep 100 &) do; done

devrait fonctionner.

Je suis le gars qui a écrit cette partie de l'article de Wikipedia (et qui a « découvert » cette cure après avoir commencé accidentellement la bombe fourche sur mon système!).

La raison de la "&!" au lieu de « & » est en effet pour empêcher zsh de faire le contrôle du travail sur le nouveau processus, à savoir, en essayant de prendre soin quand et si elle a terminé. Je ne me souviens pas exactement pourquoi le contrôle du travail était un problème quand je l'ai essayé, mais il était. Vous pouvez réellement essayer de voir comment fonctionne « guérir » et ce qui se passe si vous ne bloquez pas le contrôle de l'emploi. Peut-être que le problème avec le contrôle du travail a dû faire avec un bug dans zsh qui n'existe même pas en bash, et peut-être il n'est plus pertinent dans zsh soit.

Alors essayez juste un « & » avec bash, et si le contrôle du travail interfère, essayez de le désactiver ( « set + m ») et nous espérons que cela fonctionnerait.

Vous avez raison que l'article wikipedia ne devrait probablement pas dépendre zsh.

question très intéressante!

Selon cet article de Wikipédia, l'objet de la commande complète est de créer de nombreux emplois inoffensifs qui désactive la bombe à fourche, car il ne sera plus en mesure de se reproduire encore plus d'enfants.

Selon le zsh manuel,

  

Si un travail est démarré avec &|' or &!,   alors que l'emploi est immédiatement désavoué.   Après le démarrage, il n'a pas de   placer dans la table de travail, et ne   sous réserve des fonctions de contrôle de l'emploi   décrit ici.

Je ne suis pas sûr de savoir comment atteindre le même avec bash. Cependant, quelque chose comme ce qui suit pourrait faire:

nohup sleep 100 &
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top