- ADVERTENCIA NO INTENTE EJECUTAR ESTO EN UNA MÁQUINA DE PRODUCCIÓN
Al leer la página de Wikipedia sobre el tema, generalmente sigo lo que sucede con el siguiente código:
:(){ :|:& };:
extracto de la descripción
La siguiente bomba de horquilla se presentó como arte en 2002;56
se desconoce su origen exacto, pero existía en Usenet antes de 2002.
La bomba se ejecuta pegando los siguientes 13 caracteres en una
shell UNIX como bash o zsh. Opera definiendo
una función llamada ':', que se llama a sí misma dos veces, una en el
primer plano y otra en el fondo.
Sin embargo, lo último no me queda del todo claro. Veo la definición de la función:
:(){ ... }
Pero, ¿qué más está pasando? También haga otros shells como ksh
, csh
y tcsh
también correría la misma suerte de poder construir algo similar?
Respuesta aceptada:
Esta bomba de bifurcación siempre me recuerda algo que dijo un profesor de programación de IA en una de las primeras lecciones a las que asistí "Para entender la recursividad, primero debes entender la recursividad".
En esencia, esta bomba es una función recursiva. En esencia, creas una función, que se llama a sí misma, que se llama a sí misma, que se llama a sí misma... hasta que se consuman los recursos del sistema. En este caso específico, la recurrencia se amplifica mediante el uso de canalización de la función a sí misma Y ponerla en segundo plano.
He visto esto respondido en StackOverflow, y creo que el ejemplo dado allí lo ilustra mejor, solo porque es más fácil ver lo que hace de un vistazo (robado del enlace de arriba...)
☃(){ ☃|☃& };☃
Definir la función de error ☃() { ... }
, cuyo cuerpo se llama a sí mismo (la función de error), canalizando la salida a sí mismo (la función de error) ☃|☃
y en segundo plano el resultado &
. Luego, después de definir la función, llame a la función de error, ; ☃
.
Observo que, al menos en mi Arch VM, la necesidad de poner en segundo plano el proceso no es un requisito para tener el mismo resultado final, para consumir todo el espacio de proceso disponible y hacer que el host funcione. En realidad, ahora he dicho que a veces parece terminar el proceso de ejecución y después de una pantalla llena de -bash: fork: Resource temporarily unavailable
se detendrá con un Terminated
(y journalctl
muestra bash core volcado).
Para responder a su pregunta sobre csh/tcsh, ninguno de esos shells admite funciones, solo puede alias. Entonces, para esos shells, tendría que escribir un script de shell que se llame a sí mismo de forma recursiva.
zsh parece sufrir el mismo destino (con el mismo código), no realiza un volcado del núcleo y hace que Arch proporcione Out of memory: Kill process 216 (zsh) score 0 or sacrifice child.
, pero aún continúa bifurcándose. Después de un tiempo, dice Killed process 162 (systemd-logind) ...
(y aún sigue teniendo un zsh bifurcado).
Arch no parece tener un pacman
versión de ksh, así que tuve que probarlo en Debian. ksh objetos a :
como nombre de función, pero usando algo, digamos b()
en cambio, parece tener el resultado deseado.