Wie funktioniert „, während (Schlaf 100 &!) Zu tun; „Arbeit in zsh getan, und wie könnte es in bash repliziert werden?

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

  •  05-09-2019
  •  | 
  •  

Frage

Nach Wikipedia kann die forkbomb :(){ :|:& };: mit der zsh Befehl while (sleep 100 &!) do; done gestoppt werden, die angeblich laichen Schlaf 100 verarbeitet, bis alle forkbomb Prozesse verschwunden sind. Dies scheint wie Magie; wie funktioniert es? Ich bin besonders gespannt, genau das, was „&“ bedeutet.

Was wäre ein äquivalenter Befehl aussehen wie in der Bash?

War es hilfreich?

Lösung

Der Grund, dass eine Gabel-Bombe funktioniert, weil es eine endliche Grenze für die Anzahl der Prozesse, die zu einem bestimmten Zeitpunkt ausgeführt werden können, und eine Gabel-Bombe ist so konzipiert, diese Grenze zu füllen.

Da der forkbomb Code, den Sie stirbt vorgesehen, wenn es nicht ein Kind Prozess erzeugen kann, haben die Eltern Prozesse nicht wirklich hängen herum, aber die Tatsache, dass die Kinder neuen großen * -Kinder immer die Schaffung hält die Prozesstabelle voll ist.

So ist die Schlaf-Lösung in einigen Prozessen zu schleichen ist so konzipiert, dass nur für eine kurze Zeit schlafen, und für jeden Schlafprozess, der erstellt werden verwaltet, gibt es weniger gabel Bomben passieren. Schließlich füllen sich die Schlaf verarbeitet die Vorarb Tisch selbst und die Gabel Bomben absterben.

Sobald die Prozess-Tabelle voll aus Schlaf verarbeitet die while-Schleife getötet werden kann, und der Schlaf Prozesse werden sterben, wenn ihre Ruhezeit abgelaufen ist. Problem gelöst .

Wie bereits den wichtigen Teil des zsh Befehl erwähnt ist der Run-in-Hintergrund &, so dass die bash Befehl wäre im Grunde das gleiche wie in den anderen Antworten gegeben:

while (sleep 100 &) do; done

Ich glaube nicht, dass der nohup / ! Teil ist wichtig, wenn Sie innerhalb der Ruhezeit abmelden mögen, aber ich würde gerne direkt zu setzen, wenn ich falsch bin.

Andere Tipps

Zuerst wird die Gabel Bombe kann geschrieben werden:

foo()
{
    foo|foo&
}
foo

Was macht es ein wenig klarer - jede Iteration zwei Teilprozesse gestartet wird, dann stirbt. Also, wenn das Forking ausfällt, wird es nicht rumhängen.

Deshalb alles, was wir tun müssen, ist das Forking vorübergehend nicht zu machen. So schaffen wir Prozesse, die 100 und besetzen Prozessraum schlafen, da die Schlafprozesse tun.

Die zsh &! ist wie & aber verleugnet den neuen Prozess (nicht tötet es bei der Abmeldung) - es ist wahrscheinlich in diesem Beispiel nicht wichtig. ( Handbuch ) Es kann mit nohup ersetzt werden.

Deshalb ist die bash:

while (nohup sleep 100 &) do; done

sollte funktionieren.

Ich bin der Typ, der schrieb, dass ein Teil des Wikipedia-Artikels (und der „entdeckt“ diese Heilung nach der Gabel Bombe auf meinem System versehentlich starten!).

Der Grund für die „&“ statt „&“ ist in der Tat zsh zu tun, Job-Steuerung über den neuen Prozess zu verhindern, das heißt, zu kümmern versucht, ob und wann es fertig. Ich erinnere mich nicht genau, warum Auftragssteuerung ein Problem war, als ich es versucht, aber es war. Sie können es tatsächlich versuchen, wie die „Heilung“ Werke zu sehen, und was passiert, wenn Sie nicht über Job-Kontrolle verhindern. Vielleicht hatte das Problem mit Jobsteuerung mit einigen Bug in zsh zu tun, das nicht einmal in der Bash nicht vorhanden ist, und vielleicht ist es nicht mehr relevant in zsh auch nicht.

So versucht, nur ein „&“ mit bash, und wenn Auftragssteuerung gestört wird, versuchen, sie zu deaktivieren ( „set + m“) und hoffentlich würde das funktionieren.

Sie haben Recht, dass der Wikipedia-Artikel soll wohl nicht sein zsh abhängig.

Sehr interessante Frage!

Nach diesem Wikipedia-Artikel, der Zweck des kompletten Befehls viele harmlosen Arbeitsplätze zu schaffen, die die Gabel Bombe deaktivieren werden, weil es nicht mehr in der Lage noch mehr Kinder laichen.

Nach dem zsh Handbuch ,

  

Wenn ein Job gestartet mit &|' or &!‘   dann wird dieser Job sofort verleugnet.   Nach dem Start hat es keine   Platz in der Jobtabelle und ist nicht   zu den Jobsteuerungsfunktionen Thema   hier beschrieben.

Ich bin nicht sicher, wie das gleiche mit bash zu erreichen. Doch so etwas wie die folgenden tun könnte:

nohup sleep 100 &
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top