Saltar al contenido

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.

04-process-exit.zolo
Playground
// 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.

05-on-shutdown.zolo
Playground
// 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.

07-on-panic.zolo
Playground
// 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.

06-on-signal.zolo
Playground
// 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").

Buscar en Zolo

9 resultados

enespt-br