
Herramienta de observabilidad de señales del kernel en vivo que utiliza tracepoints eBPF para transmitir cada señal generada en un host Linux, mostrando emisor, destino, disposición, latencia del manejador e interrupciones de llamadas al sistema en tiempo real.
sigwire
tail -fpara señales. Cada señal que cualquier proceso en el sistema genera — quién la envió, a quién impactó, qué señal, cómo se generó (kill(2), el kernel, un temporizador POSIX), si el objetivo la atrapó y cuánto tiempo ejecutó su manejador, si interrumpió una syscall bloqueada conEINTR— decodificada desde los tracepoints de señales del kernel y transmitida en vivo a tu terminal. Sinstrace -fen un solo pid, sinptrace, sin cooperación de los procesos involucrados.
sigwire convierte la maquinaria de señales del kernel en un patchbay en vivo: cada línea es remitente ──SEÑAL──▶ destinatario, coloreada por severidad, etiquetada con cómo se generó, si el destinatario atrapó la señal (y cuánto tiempo ejecutó su manejador), si interrumpió una syscall bloqueada (↯ EINTR read), colapsada a ×N cuando algo hace spam, y marcada ☠ cuando es un golpe mortal real. Un carril lateral cuenta lo que está volando por el cable; pausa y selecciona una fila para inspeccionar la imagen completa — disposición, dirección del manejador, flags de sigaction, y las señales que el destinatario estaba bloqueando en ese instante.
Porque engancha los tracepoints del kernel, no a un solo proceso, una sola ejecución observa cada señal en el host a la vez — tu aplicación, un supervisor, la propia maquinaria de fallos del kernel — sin que ninguno de ellos sepa que está siendo rastreado.
[!TIP] Dos caras de cada señal. sigwire monitorea tanto
signal:signal_generate(la vista del remitente — quién generó qué, la línea del panel de conexiones) comosignal:signal_deliver(la vista del destinatario — si la atrapó, con qué manejador y flags, qué estaba bloqueando, y si interrumpió una syscall). Dos enganches más —rt_sigreturn(2)y el tracepoint de salida de syscall — miden el manejador y capturan EINTR. Todo se correlaciona de nuevo en una fila. Esta división es también por qué el conteo de☠ fatales deliberadamente conservador (ver Qué cuenta como fatal): la generación ocurre antes de la entrega, por lo que el lado del remitente no puede conocer el destino de una señal — solo el lado de la entrega puede, y solo para los casos que observa.
curl -fsSL https://yeet.cx | sh # install the yeet daemon (one time) yeet run github:yeet-src/sigwire # run the dashboard (the daemon does the privileged BPF load)
[Manual install guide](https://yeet.cx/docs/manual-installation) | Solo Linux
Nada que configurar — las señales son tráfico de fondo constante en cualquier máquina, así que las filas empiezan a aparecer inmediatamente en la parte superior. ¿Quieres generar algunas tú mismo? `kill -USR1 <pid>`, `Ctrl-C` en un trabajo en primer plano, o inicia cualquier runtime gestionado y observa cómo su GC/scheduler hace ping a sus propios hilos (`↯ EINTR futex` pasando).
## Controles
El flujo sigue la señal más nueva por defecto; selecciona una fila o pausa y se mantiene quieto mientras los datos siguen fluyendo debajo.
| tecla | acción |
| ----- | ------ |
| `p` · `Space` | pausar / reanudar el flujo (congelarlo para leer) |
| `↑`/`↓`, `k`/`j` | pausar e inspeccionar una fila — abre el panel de detalles |
| `/` | filtro difuso — coincide con proceso, pid, señal, fuente y disposición; los caracteres coincidentes se resaltan en vivo |
| `e` | filtrar solo **syscalls interrumpidas** (`↯ EINTR` / `↺ reiniciadas`) |
| `s` | abre el **selector de señales** — silenciar o mostrar cualquier señal, en vivo |
| `Esc` | retroceder un nivel — limpiar el filtro / cerrar el selector / soltar la selección, luego salir |
| `q` | salir |
## Lo que estás viendo
Cada fila es una señal generada, la más nueva arriba:```
WHEN SENDER SIGNAL TARGET NOTE
now bash·4402──SIGINT───▶ node·8813 kill(2) ↯ EINTR read caught 41µs
1.2s systemd·1──────SIGTERM──▶ nginx·1291 kill(2) caught 1.2ms
3.4s kernel·8813──SIGSEGV──▶ chrome·8813 fault default ☠
4.1s postgres·507──SIGUSR1───▶ postgres·509 ×6 kill(2) caught 9µs
Cada fila es un bloque: el remitente → destino son comm·pid (el remitente es quien elevó la señal, current; el destino es a quién va dirigida), el cable en el medio lleva el nombre de la señal coloreado por severidad, ×N pliega una ráfaga de la señal idéntica en una línea, y la nota a la derecha da el origen, luego cualquier interrupción de syscall, luego la disposición.
Cada fila se congela en el momento en que su entrega se resuelve y nunca muta de nuevo — por lo que una ráfaga se desplaza como un registro estable, no un agregado parpadeante.
El cable se colorea por severidad en la misma paleta de 256 colores que el resto de la interfaz:
| severidad | señales | color |
|---|---|---|
| kill | SIGKILL | rojo intenso |
| fatal (con volcado de núcleo) | SEGV BUS ABRT ILL FPE TRAP SYS QUIT | rojo |
| terminación | TERM INT HUP PIPE ALRM … | ámbar |
| control de trabajos | STOP TSTP TTIN TTOU | amarillo |
| continuar | CONT | verde |
| usuario | USR1 USR2 | cian |
| tiempo real | SIGRTMIN+n | violeta |
| mantenimiento | CHLD URG WINCH … | gris |
La nota es el origen (kill(2), tgkill, sigqueue, timer, kernel, fault); luego, si interrumpió una syscall bloqueada, ↯ EINTR read (o ↺ restarted read cuando SA_RESTART la reanudó automáticamente); luego la disposición — caught 41µs (un manejador se ejecutó, y cuánto tardó), default (sin manejador, se aplicó la acción por defecto), o ⊘ ignored. Un ☠ marca un golpe mortal real (ver Qué cuenta como fatal).
[!NOTE]
↯ EINTRes el que hay que vigilar. Una señal que llega mientras un hilo está estacionado en una syscall lenta (read,poll,accept,futex,nanosleep, …) lo saca de allí: la syscall devuelve-1/EINTRy, a menos que el manejador haya establecidoSA_RESTART, no se reanuda — la aplicación debe reintentar. Olvidar eso es un error clásico, exasperante, dependiente del tiempo ("¿por qué miread()falló una vez?"). sigwire lo muestra ocurriendo en vivo, y qué syscall recibió el golpe. Presionaepara ocultar todo lo demás y ver solo las interrupciones.
El carril de la derecha es la vista agregada: señales principales por volumen, un desglose por origen y un recuento de entrega — cuántas señales fueron capturadas vs. alcanzaron su valor por defecto vs. ignoradas.