Ciclo de Vida del Proceso
En esta página
Zolo ofrece cuatro puntos de extensión para el ciclo de vida de un proceso CLI:
salida controlada con process.exit, limpieza LIFO con on shutdown, captura
de panics con on panic e interceptación de señales con on signal.
Salida controlada
process.exit(code) termina el proceso con el código indicado y aún dispara
todos los hooks on shutdown antes de salir — a diferencia de un abort
abrupto:
El hook on shutdown reason se registra antes de process.exit(0). Ejecuta
localmente con DEMO_MODE=fail para ver la salida con código 1.
// Feature: controlled exit — `process.exit(code)`
// Syntax: `process.exit(0)` for success, `!= 0` for failure.
// When to use: a CLI script signaling a code to the shell; pre-flight
// checks that need to abort early. `on shutdown` hooks still run before
// the process exits.
use std::process
use std::env
on shutdown reason {
print("[shutdown] reason: {reason}")
}
let mode = env.get("DEMO_MODE") ?? "ok"
if mode == "fail" {
print("failure mode - exiting with 1")
process.exit(1)
}
print("success mode - exiting with 0")
process.exit(0)
print("unreachable")
// expected:
// success mode - exiting with 0
// [shutdown] reason: exit
Requiere la CLI o el host de Zolo; ábrelo en el playground o ejecútalo localmente.
Múltiples hooks de cierre
Puedes declarar tantos bloques on shutdown como quieras. Se disparan en orden
LIFO (el último declarado se ejecuta primero), lo que facilita la composición
de capas de limpieza independientes:
Tres bloques on shutdown — el hook 3 se ejecuta antes del 2, que se ejecuta
antes del 1. El parámetro reason es opcional: omitirlo es válido.
// Feature: lifecycle — `on shutdown` (composes in LIFO order)
// Syntax: `on shutdown { ... }` or `on shutdown reason { ... }`
// When to use: clean up resources (close files, flush logs, drop
// connections) regardless of the exit path (normal, exit, panic, signal).
// Multiple blocks compose in LIFO order — the last one declared runs first.
on shutdown {
print("[hook 1] outermost cleanup (declared first, runs LAST)")
}
on shutdown reason {
print("[hook 2] exit reason: {reason}")
}
on shutdown {
print("[hook 3] innermost cleanup (declared last, runs FIRST)")
}
print("main work")
print("done")
// expected:
// main work
// done
// [hook 3] innermost cleanup (declared last, runs FIRST)
// [hook 2] exit reason: normal
// [hook 1] outermost cleanup (declared first, runs LAST)
Requiere la CLI o el host de Zolo; ábrelo en el playground o ejecútalo localmente.
Captura de panic
on panic e es el último recurso antes del cierre por error fatal: recibe el
mensaje de panic(...) y se ejecuta antes de on shutdown. Úsalo para escribir
logs de diagnóstico o métricas de fallo:
La llamada a panic(...) está comentada para mantener el código de salida 0 en
el sandbox; lee los comentarios y descoméntalo localmente para ver la secuencia
completa.
// Feature: lifecycle — `on panic` catches uncaught panics
// Syntax: `on panic e { ... }` receives the message; runs BEFORE
// `on shutdown` — last chance to log / dump diagnostics.
// When to use: catch crashes in production (telemetry, dump file),
// turn a panic into a structured log entry.
//
// NOTE: an uncaught panic exits the process with a non-zero status
// AFTER the `on panic` / `on shutdown` hooks fire. To keep this
// example green in test harnesses (which expect exit code 0), the
// `panic(...)` call below is left commented out and only documented.
on panic e {
print("[panic] caught: {e}")
}
on shutdown reason {
print("[shutdown] reason: {reason}")
}
print("before crash")
// panic("something went very wrong")
//
// expected (when the panic line is uncommented):
// before crash
// [panic] caught: something went very wrong
// [shutdown] reason: panic
// (process exits with non-zero status)
print("(panic skipped to keep exit code 0; see comment above)")
Requiere la CLI o el host de Zolo; ábrelo en el playground o ejecútalo localmente.
Señales del sistema operativo
on signal SIGINT { ... } registra un handler asíncrono para una señal. En
Windows solo se entregan SIGINT (Ctrl+C) y SIGTERM (Ctrl+Break).
process.raise permite sintetizar la señal en el proceso para pruebas:
process.raise("SIGINT") entrega la señal; process.sleep(50) espera a que el
hilo de señal drene el evento antes de que la ejecución principal continúe.
// Feature: lifecycle — `on signal` for SIGINT / SIGTERM
// Syntax: `on signal SIGINT { ... }`. On Windows, only SIGINT (Ctrl+C)
// and SIGTERM (Ctrl+Break) are delivered.
// When to use: graceful shutdown — interrupt server loops, save
// state, close connections before dying.
use std::process
var fired = 0
on signal SIGINT {
fired = fired + 1
print("SIGINT received (time #{fired})")
}
on shutdown reason {
print("shutdown reason: {reason}")
}
// `process.raise` injects a synthetic signal — useful for testing
// without needing a shell to send Ctrl+C from outside.
print("raising SIGINT...")
process.raise("SIGINT")
// Give the lifecycle thread time to drain the signal.
process.sleep(50)
print("after sleep, fired={fired}")
print("done")
// expected:
// raising SIGINT...
// SIGINT received (time #1)
// after sleep, fired=1
// done
// shutdown reason: normal
Requiere la CLI o el host de Zolo; ábrelo en el playground o ejecútalo localmente.
Desafío
Agrega un segundo on signal SIGINT que imprima "handler 2" y verifica que
ambos se disparen en orden de declaración cuando se llama a
process.raise("SIGINT").
Consulta también