返回

文章详情

显示HN:Sigwire – 为您Linux盒子上的每个信号提供实时TUI交换机

Hacker News2026年7月13日 20:07

用于信号的tail -f。任何进程在盒子上引发的每个信号 — 谁发送了它,谁被击中,哪个信号,以何种方式引发(kill(2),内核,POSIX定时器),目标是否被捕获以及处理器运行了多长时间,是否因EINTR中断了一个被阻塞的系统调用 — 从内核的信号跟踪点解码并实时流式传输到您的终端。没有对单个pid的strace -f,没有ptrace,涉及的进程也没有合作。sigwire将内核的信号机制转变为实时补丁:每一行是发送者 ──SIGNAL──▶ 目标,按严重程度着色,标记为如何引发,目标是否捕获它(以及处理器运行了多长时间),是否中断了一个被阻塞的系统调用(↯ EINTR读取),在某个信号频繁时折叠为×N,当它是一击毙命时标记☠。旁边的轨道统计着飞过线的信号;暂停并选择一行,检查全貌 — 处置,处理器地址,sigaction标志,以及目标在那一刻被阻塞的信号。因为它挂钩内核的跟踪点,而不是任何一个进程,所以一次单独的运行可以观察主机上的每个信号 — 您的应用,一个监控程序,内核自己的故障机制 — 而没有任何一个知道他们正在被跟踪。提示每个信号的两个方面。sigwire同时观察信号:signal_generate(发送者的视图 — 谁引发了什么,交换机线路)和signal_deliver(目标的视图 — 它是否捕获,使用了哪个处理器和标志,阻塞了什么,是否中断了系统调用)。还有两个更多的挂钩 — rt_sigreturn(2)和系统调用退出跟踪点 — 记录处理器时间并捕获EINTR。这一切都相关联回一行。这种拆分也是☠致命计数出于故意保守的原因(请参见什么算作致命): 生成发生在传递之前,因此发送者一侧无法知道信号的命运 — 只有交付一侧能知道,而且只限于它观察到的情况。快速开始curl -fsSL https://yeet.cx | sh # 安装yeet守护进程(一次性)yeet run github:yeet-src/sigwire # 运行仪表板(守护进程执行特权BPF加载)手动安装指南 | 仅限Linux没有配置 — 信号是在任何盒子上的恒定后台流量,因此行会立即开始出现在顶部。想自己做一些吗?kill -USR1 <pid>,Ctrl-C一个前台工作,或启动任何管理的运行时,观察其GC/调度程序如何ping自己的线程(↯ EINTR futex滚动)。控制信息默认按照最新信号进行排序;选择一行或暂停,它会保持静止,同时数据在下面持续流动。键位操作p · 空格暂停/恢复数据流(冻结以便阅读)↑ / ↓ ,k / j暂停并检查一行 — 打开详细面板/模糊过滤器 — 匹配进程,pid,信号,来源和处置;匹配的字符实时高亮e过滤器仅针对中断的系统调用(↯ EINTR / ↺重启)s打开信号选择器 — 静音或显示任何信号,实时Esc退回一层 — 清除过滤器/关闭选择器/取消选择,然后退出q退出您所看到的每一行是一个生成的信号,最新在顶部:当发送者信号目标备注现在bash·4402──SIGINT───▶node·8813kill(2) ↯ EINTR读取捕获41µs 1.2ssystemd·1──────SIGTERM──▶nginx·1291kill(2)捕获1.2ms 3.4skernel·8813──SIGSEGV──▶chrome·8813故障默认☠ 4.1s postgres·507──SIGUSR1───▶postgres·509 ×6 kill(2)捕获9µs每一行都是一个块:发送者→目标为comm·pid(发送者是发出信号的任何人,当前;目标是它所针对的对象),中间的线携带由严重程度着色的信号名称,×N将一组相同的信号折叠为一行,右侧的备注给出源,然后是任何系统调用中断,然后是处置。每一行在其传递决议的那一刻被冻结,再也不会变化-因此一段爆发以稳定的日志方式滚动,而不是闪烁的汇总。中间线根据与UI其余部分相同的256色调色板按严重程度着色:严重程度信号颜色kill SIGKILL 热红色致命(内存转储)SEGV BUS ABRT ILL FPE TRAP SYS QUIT 红色终止TERM INT HUP PIPE ALRM …琥珀色工作控制STOP TSTP TTIN TTOU 黄色继续CONT绿色用户USR1 USR2 青色实时SIGRTMIN+n 紫色家务 CHLD URG WINCH … 灰色备注是来源(kill(2),tgkill,sigqueue,定时器,内核,故障);然后,如果它中断了一个被阻塞的系统调用,↯ EINTR读取(或者↺重启读,当SA_RESTART自动恢复它);然后是处置 — 捕获41µs(处理程序运行时及其耗时),默认(没有处理程序,应用默认行为),或⊘忽略。 ☠标记是真正的致命一击(请参见什么算作致命)。注意↯ EINTR是一个必须监视的信号。在一个线程停在慢速系统调用(读取,轮询,接受,futex,nanosleep,……)时,一个到达的信号会将其拽出:系统调用返回-1 / EINTR,除非处理程序设置SA_RESTART,它不会继续 — 应用必须重试。忘记这一点是一个经典,令人恼火,依赖时序的错误(“我的read()怎么了”)。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡