¿Cómo funciona “, mientras que (el sueño y 100!) Hacen; realiza”trabajo en zsh, y como no podía ser replicado en bash?

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

  •  05-09-2019
  •  | 
  •  

Pregunta

De acuerdo con Wikipedia , :(){ :|:& };: forkbomb se puede detener con el comando while (sleep 100 &!) do; done zsh, que se supuestamente desovar sueño 100 procesos hasta que todos los procesos se han ido forkbomb. Esto parece como magia; ¿como funciona? Estoy especialmente curioso en cuanto a exactamente qué "y" significa.

¿Cómo sería un comando equivalente parecerse en bash?

¿Fue útil?

Solución

La razón de que un tenedor-bomba funciona es porque hay un límite finito al número de procesos que pueden estar corriendo en un momento dado, y un tenedor-bomba está diseñada para llenar este límite.

Debido a que el código de forkbomb le proporcionó muere si no puede generar un proceso hijo, los procesos padre en realidad no colgar alrededor, pero el hecho de que los niños siguen creando nuevas grandes -los niños * mantiene la tabla de procesos completa.

Así que la solución del sueño se diseña para colarse en algunos procesos que simplemente dormir por un corto período de tiempo, y para cada proceso del sueño que se las arregla para ser creado, hay menos carretillas bombas que suceden. Finalmente, los procesos del sueño llenan la mesa proces sí mismos y las bombas de horquilla mueren.

Una vez que la tabla de procesos son los procesos de sueño completo fuera del bucle while puede ser matado, y los procesos de sueño va a morir una vez que su tiempo de sueño se ha acabado. Problema resuelto .

Como ya se ha mencionado la parte importante del comando zsh es el & de ejecución en segundo plano, por lo que el comando de bash sería básicamente la misma que la dada en las otras respuestas:

while (sleep 100 &) do; done

No creo que la parte nohup / ! es importante a menos que desee cerrar la sesión en el tiempo de sueño, pero estaría feliz de ser fijado directamente si estoy equivocado.

Otros consejos

En primer lugar, la bomba tenedor se puede escribir:

foo()
{
    foo|foo&
}
foo

Lo que hace que sea un poco más claro - cada iteración comienza dos subprocesos, luego muere. Así que si falla la bifurcación, no va a colgar alrededor.

Por lo tanto, todo lo que tenemos que hacer es tomar la bifurcación temporal fallar. De este modo creamos procesos que duermen 100 y ocupan espacio del proceso, ya que los procesos del sueño hacen.

El &! zsh es como & pero reniega el nuevo proceso (no matarlo al cerrar la sesión) - que probablemente no es importante en este ejemplo. ( manual de ) Puede ser reemplazado con nohup.

Por lo tanto el bash:

while (nohup sleep 100 &) do; done

debería funcionar.

Soy el tipo que escribió esa parte del artículo de Wikipedia (y quien "descubrió" esta cura después de comenzar accidentalmente la bomba tenedor en mi sistema!).

La razón de la "&!" en lugar de "Y" es de hecho para evitar zsh de hacer para controlar los trabajos sobre el nuevo proceso, es decir, tratando de cuidar siempre y cuando se terminó. No recuerdo exactamente por qué el control de trabajos era un problema cuando lo probé, pero era. En realidad se puede probar para ver cómo funciona "curar" y lo que sucede si no impiden el control de trabajos. Tal vez el problema con el control de trabajos tenía que ver con algún error en zsh que ni siquiera existe en bash, y puede que ya no es relevante en zsh tampoco.

Así que trate sólo una "Y" con bash, y si el control de trabajos está interfiriendo, tratar de desactivarla ( "set + m") y es de esperar que esto funcionaría.

Tiene razón de que el artículo de Wikipedia probablemente no debería ser zsh dependiente.

Una pregunta muy interesante!

De acuerdo con ese artículo de Wikipedia, el propósito del comando completo es la creación de muchos puestos de trabajo inofensivas que desactivará la bomba tenedor ya que ya no es capaz de generar aún más niños.

De acuerdo con la zsh manual de ,

  

Si un trabajo se inicia con &|' or Y!',   entonces ese trabajo es repudiado de inmediato.   Después del inicio, que no tiene una   colocar en la mesa de trabajo, y no es   sujeto a las características de control de trabajos   se describe aquí.

No estoy seguro de cómo lograr lo mismo con bash. Sin embargo, algo parecido a la siguiente podría hacer:

nohup sleep 100 &
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top