Sysdig 常用 CLI 命令详解(核心篇)
Sysdig 0.41.4 核心命令实战:实时捕获与 -n/-M 限量、按进程/端口/写盘过滤、-A 与 spy_port 明文还原 HTTP、-w/-r 离线落盘滚动与回放、top 类 chisel 榜单与 csysdig TUI,含 SIGTERM 丢输出、捕获窗口、字节聚合缺行等真实踩坑(2026-10-27 实测)。
Sysdig 常用 CLI 命令详解(核心篇)
目标:把 Sysdig 日常排障最高频的命令打穿——实时捕获与限量、按进程/端口/写盘过滤、HTTP 明文还原、.scap 离线落盘与回放、top 类 chisel 榜单、csysdig 交互界面,并沉淀四个真实踩坑:timeout 默认 SIGTERM 丢 chisel 收尾输出、捕获窗口过短导致「落盘了但不是要的时段」、滚动文件命名无分隔点、table_generator 以 evt.rawarg.res 聚合字节时 write 事件不进榜。已在 Ubuntu 24.04.5 LTS + Sysdig 0.41.4 上全量实测通过(2026-10-27)。
一、环境信息
| 项目 | 实测值 |
|---|---|
| 操作系统 | Ubuntu 24.04.5 LTS(内核 7.0.0-38-generic,x86_64) |
| 软件版本 | sysdig 0.41.4 / csysdig 0.41.4(安装见《Sysdig 安装与初始化实战》) |
| 探针形态 | 内核模块 scap-8.1.0+driver(首次运行自动装载) |
| 演示数据 | /work/d1.scap:受控 10 秒窗口捕获,93MB,含 40MB dd 写盘与 3 次 curl 127.0.0.1:8144 明文 HTTP 请求 |
| 实时事件量级 | 空闲压力下 sysdig -M 2 实测 737,599 条/2 秒(多业务并行的高压机器) |
| chisel 数量 | 66 个(/usr/share/sysdig/chisels/) |
| 实测日期 | 2026-10-27 |
💡 说明:本文「实时」「回放」两种模式混用——实时给限量/时长控制,回放(
-r读 /work/d1.scap)保证结果可复现。两种模式的过滤语法与输出格式完全一致,差异只在数据来源。
二、前置条件
- 已按《Sysdig 安装与初始化实战》完成安装并首跑验证(
sysdig --version= 0.41.4,lsmod | grep scap有模块)。 - root 权限。
- 理解字段与过滤表达式:见《Sysdig 配置与过滤器语法详解》,本文直接使用其中的字段体系。
三、命令速查总览
| 命令 | 用途 | 本文锚点 |
|---|---|---|
sysdig -n 3 | 实时捕获,限 3 条 | 4.1 |
sysdig -M 2 | 实时捕获,限 2 秒 | 4.1 |
sysdig "proc.name=xxx" | 按进程过滤 | 4.2 |
sysdig "evt.type=connect and fd.sport=8144" | 按端口过滤 | 4.3 |
sysdig "fd.name=/path/file" | 按文件过滤 | 4.4 |
sysdig -A "evt.is_io_write=true and fd.sport=8144" | ASCII 明文还原 | 4.5 |
sysdig -c spy_port.lua 8144 | 端口流量内容直显 | 4.5 |
sysdig -w f.scap -C 10 -W 3 | 落盘 + 滚动 | 4.6 |
sysdig -r f.scap "过滤" | 回放 + 过滤 | 4.6 |
sysdig -c topfiles_bytes.lua | top 类榜单 | 4.7 |
csysdig | 全屏交互界面 | 4.8 |
四、核心命令详解
4.1 实时捕获与限量
裸跑 sysdig 是全量实时流,Ctrl-C 结束。两个限量参数决定「看多久」:
按事件数限量(-n)——抓 3 条即停(《Sysdig 安装与初始化实战》6.1 的同环境实测回显):
sysdig -n 3
2 10:22:09.510773250 5 <NA> (4279) > ioctl fd=12 request=C00864D0 argument=7FFD68183BA0
3 10:22:09.510777110 5 <NA> (4279) > futex addr=5944D8A4BD10 op=129(FUTEX_PRIVATE_FLAG|FUTEX_WAKE) val=1
4 10:22:09.510780526 5 <NA> (4279) > recvmsg fd=110
按时长限量(-M)——限定采集秒数,统计事件量(实测,2 秒窗口的完整计数):
sysdig -M 2 | wc -l
737599
⚠️ 注意事件量级:这台多业务并行的高压机器 2 秒产生 73 万+条事件。这意味着「裸 -n 限量」的窗口可能不到 1 秒——想观察一段特定行为(如一次写盘、一次请求),要么用 -M 定时窗,要么先 -w 落盘再回放过滤(4.6),要么把过滤表达式直接挂在捕获上(实时过滤是在引擎侧完成的,不占用终端吞吐)。
4.2 按进程过滤
proc.name 是最高频的过滤维度。实测:捕获一个改名进程(/work/sd-demo-sleep)的完整生命周期:
sysdig "proc.name=sd-demo-sleep" -n 2
输出节选(实测首行截断展示,完整行超 200 列):
429151 10:30:13.526118202 0 sd-demo-sleep (3811943) < execve res=0 exe=/work/sd-demo-sleep args=30. tid=3811943(sd-demo-sleep) pid=3811943(sd-demo-sleep) ptid=3811942(timeout) cwd=<NA> fdlimit=1024 pg
429161 10:30:13.526134521 0 sd-demo-sleep (3811943) > brk addr=0
第一行是 execve 完整上下文(exe 路径、参数、父进程、fd 上限),第二行起是进程内的常规事件。排障时「先锁进程、再看它的全部系统调用」就是这个模式的典型用法。
4.3 按端口与网络过滤
套接字维度用 fd 类的 ip/port 字段。实测:抓目标端口 8144 的连接建立:
sysdig "evt.type=connect and fd.sport=8144" -n 2
175416 10:27:06.527095453 1 curl (3805814) < connect res=-115(EINPROGRESS) tuple=127.0.0.1:43806->127.0.0.1:8144 fd=5(<4t>127.0.0.1:43806->127.0.0.1:8144)
事件行自带完整四元组 tuple。网络过滤的常用组合:
fd.type in (ipv4, ipv6) # 限定 TCP/UDP 套接字
fd.sip / fd.cip # 服务端/客户端 IP
fd.sport / fd.cport # 服务端/客户端端口
4.4 按文件与写盘过滤
精确路径——观察一个文件被写入的完整过程(openat → dup2 重定向,实测):
sysdig "fd.name=/work/demo.txt" -n 3
106556 10:27:34.742198847 2 <NA> (3806719) < openat fd=3(<f>/work/demo.txt) dirfd=-100(AT_FDCWD) name=/work/demo.txt flags=262(O_TRUNC|O_CREAT|O_WRONLY) mode=0666 dev=802 ino=3944050
106567 10:27:34.742214701 2 <NA> (3806719) > dup2 fd=3(<f>/work/demo.txt)
106568 10:27:34.742215583 2 <NA> (3806719) < dup2 res=1(<f>/work/demo.txt) oldfd=3(<f>/work/demo.txt) newfd=1(<f>/work/demo.txt)
写内容搜索——不关心哪个文件,直接在全部写操作的 I/O 缓冲里搜内容(实测):
sysdig -r /work/d1.scap "evt.is_io_write=true and evt.buffer contains alpha" -n 1
259482 10:35:28.125457959 5 <NA> (3823910) < write res=12 data=alpha write. fd=1(<f>/work/data1.txt) size=12
data=alpha write. 就是那次 write 系统调用写入的原始字节——「谁在往哪里写什么内容」一步到位。
4.5 HTTP 明文还原(-A 与 spy_port)
sysdig 捕获的是系统调用层,read/write 的缓冲里就是应用层明文。-A 把二进制缓冲区按 ASCII 打印,实测还原发往 8144 端口的 HTTP 请求与响应(对 /work/d1.scap 回放):
sysdig -r /work/d1.scap -A "evt.is_io_write=true and fd.sport=8144" -n 30 | grep -E "GET|Host"
GET /?d1demo=1 HTTP/1.1
Host: 127.0.0.1:8144
GET /?d1demo=2 HTTP/1.1
Host: 127.0.0.1:8144
sysdig -r /work/d1.scap -A "evt.is_io_read=true and fd.sport=8144" -n 30 | grep -E "HTTP/|Server"
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.12.3
chisel spy_port.lua 是同能力的封装版——指定端口、自动打印双向载荷(实测):
sysdig -r /work/d1.scap -c spy_port.lua 8144 | grep -E "GET|HTTP" | head -3
GET /?d1demo=1 HTTP/1.1..Host: 127.0.0.1:8144..User-Agent: curl/8.5.0..Accept: *
GET /?d1demo=1 HTTP/1.1..Host: 127.0.0.1:8144..User-Agent: curl/8.5.0..Accept: *
HTTP/1.0 200 OK..Server: SimpleHTTP/0.6 Python/3.12.3..Date: Tue, 27 Oct 2026 10
💡 说明:
..是 spy_port 对换行等控制字符的转义显示。HTTPS 流量因 TLS 加密,系统调用层只能看到密文字节——明文还原仅适用明文协议或已解密端点;加密流量观测需在解密端点或代理层做(平台内 《mitmproxy 介绍与选型指南》 是代理层路线的参考)。
4.6 离线落盘与回放(-w / -r)
落盘:-w 把事件流原样写 .scap 文件(含捕获时的进程表,回放时可按进程/用户等维度过滤)。实测 10 秒受控窗口落出 93MB:
sysdig -w /work/d1.scap
Ctrl-C(或 timeout -s INT)结束捕获后确认文件(实测):
-rw-r--r-- 1 root root 93470872 Oct 27 10:43 /work/d1.scap
生产取证用滚动落盘防止写满磁盘——-C 按大小切分、-W 限制保留份数,-q 静默不回显(实测,10MB × 3 份滚动):
sysdig -w /work/roll.scap -C 10 -W 3 -q
-rw-r--r-- 1 root root 10006940 Oct 27 10:49 /work/roll.scap0
-rw-r--r-- 1 root root 7892088 Oct 27 10:49 /work/roll.scap1
-rw-r--r-- 1 root root 10001164 Oct 27 10:49 /work/roll.scap2
⚠️ 排障实录(滚动文件命名):滚动文件的命名是「前缀 + 序号」(roll.scap0、roll.scap1),没有分隔点。实测中用
ls /work/roll*.scap通配查找结果一无所获,误判为没生成文件——正确通配是ls /work/roll.scap*。
回放:-r 读 .scap,后面挂过滤表达式(语法与实时一致,实测):
sysdig -r /work/d1.scap "fd.name startswith /work/data" -n 2
输出节选(实测首行截断展示):
259465 10:35:28.125433687 5 <NA> (3823910) < openat fd=3(<f>/work/data1.txt) dirfd=-100(AT_FDCWD) name=/work/data1.txt flags=262(O_TRUNC|O_CREAT|O_WRONLY) mode=
259474 10:35:28.125441271 2 <NA> (3806719) > dup2 fd=3(<f>/work/data1.txt)
配合 -p 可以在回放时直接提取字段(实测用 %evt.rawarg.res 打印写入字节数):
sysdig -r /work/d1.scap -p "%evt.time %proc.name %evt.rawarg.res" "evt.is_io_write=true and fd.name=/work/dd1.bin" -n 2 | head -1
10:43:40.537238978 dd 1048576
4.7 top 类 chisel 实战
进程 CPU 榜(topprocs_cpu)——-c 调用(0.41.4 实测带不带 .lua 均可,见《Sysdig 配置与过滤器语法详解》8.2),实时模式每秒刷新:
sysdig -c topprocs_cpu
输出形态(实测节选,清除终端控制序列后):
CPU% Process Host_pid Container_pid container.name
--------------------------------------------------------------------------------
0.00% sleep 1 1 host
0.00% tokio-rt-worker 7784 7784 host
末列 container.name 是 sysdig 的固定输出列(事件所属环境标识),本机全部进程该列均为 host。
文件 I/O 字节榜(topfiles_bytes)与连接流量榜(topconns)(对 /work/d1.scap 回放实测):
sysdig -r /work/d1.scap -c topfiles_bytes.lua
Bytes container.name Filename
--------------------------------------------------------------------------------
121.44KB host /etc/passwd
104.93KB host /proc/self/status
91.41KB host /lib/x86_64-linux-gnu/libc.so.6
77.78KB host /proc/stat
sysdig -r /work/d1.scap -c topconns.lua
Bytes container.name Proto Conn
--------------------------------------------------------------------------------
9.62KB host tcp 127.0.0.1:38204->127.0.0.1:3306
6.91KB host tcp 127.0.0.1:44874->127.0.0.1:3000
⚠️ 排障实录(top 字节聚合缺行,0.41.4 实测踩坑):d1.scap 里明明有 dd 对 /work/dd1.bin 的 40MB 写盘(80 条 I/O 事件,直接过滤可复现),但 topfiles_bytes 与 topconns 的榜单里都没有对应行。三组对照实验定位:
实验 value 字段 结果 自写 chisel(table_generator 委托,过滤 startswith /work/) evt.count ✅ 正确聚合(80 /work/dd1.bin) 同结构自写 chisel evt.rawarg.res ❌ 空表 顶层自写探针逐事件取 evt.rawarg.res 并累加 evt.rawarg.res ✅ 正确聚合(41943040 字节) 过滤引擎侧(
evt.rawarg.res>1000000作过滤条件)与 Lua 逐事件取值均正常,问题锁定在 table_generator 以 evt.rawarg.res 为 value 时的聚合路径对 write 事件不生效(read 类事件可正常入榜,故榜单出现 /etc/passwd 等读取热点)。规避:① 需要字节数榜时优先实时观察并人工核对,或改用 evt.count 型统计;② 自写委托 chisel 时 value 用 evt.count,字节数用过滤表达式 +-p逐条提取(4.6 已演示);③ 现象已在 0.41.4 完整复现,遇到「落盘里明明有、榜上就是没有」先对号入座。
其他常用 top/工具类 chisel(-cl 实测分类,均为 -c 名字.lua 调用):topprocs_net(进程网络 I/O 榜)、topprocs_file(进程磁盘 I/O 榜)、topscalls(系统调用次数榜)、echo_fds(进程读写数据直显)、spy_ip/spy_port(按 IP/端口看载荷)、spy_users(交互用户活动)、ps/netstat/lsof(进程/连接/fd 清单)。
4.8 csysdig 交互界面概览
csysdig 是 sysdig 的全屏 TUI 版本,把「top 榜单 + 钻取」做成常驻交互界面。版本与用法(实测):
csysdig -h | head -3
csysdig version 0.41.4
Usage: csysdig [options] [filter]
常用选项(-h 实测存在):-v <view_id> 选择视图、-l 列出视图可用的字段、--modern-bpf / -B 与 sysdig 同义的探针形态选项。
⚠️ 排障实录(非交互环境崩溃):csysdig 必须在交互式终端(SSH 会话/本地 TTY)运行。实测在无 TTY 的自动化环境中直接启动
csysdig会直接崩溃(timeout 报the monitored command dumped core)——脚本化场景请用 sysdig CLI,TUI 留给人肉排障。在 TUI 内可按视图浏览进程、连接、文件等维度并逐层钻取,视图列表见界面内提示。
五、组合命令模板
以下模板的组合语法均经分项实测(回放示例基于 /work/d1.scap;路径类占位符替换为实际目标):
- 现场取证(滚动落盘,先存证后分析):
sysdig -w /var/captures/scene.scap -C 200 -W 5 -q
- 谁在写这个文件(定位写盘进程与完整命令行;路径为占位,触发写入后观察):
sysdig "fd.name=/data/app.log and evt.is_io_write=true" -p "%evt.time %proc.name %proc.cmdline"
- 端口流量明文观察(明文服务排障):
sysdig -c spy_port.lua 8144 -M 30
- 进程行为画像(一个进程的全部网络 + 文件事件):
sysdig -r /work/d1.scap "proc.name=curl and (fd.type in (ipv4, ipv6) or evt.is_io=true)"
- 回放复核(现场文件带回来离线分析):
sysdig -r scene.scap "evt.failed=true and evt.dir=<" -n 50
六、常见问题(FAQ)
Q1:用 timeout 10 sysdig -c xxx.lua 跑 chisel,结果文件是空的?
timeout 默认发 SIGTERM,chisel 的收尾输出(on_capture_end 的最终表格)不会执行。实测教训:改用 timeout -s INT 10 ...(模拟 Ctrl-C)后收尾表格正常输出。落盘(-w)同理建议 -s INT 结束,确保文件头/索引完整收尾。
Q2:-n 60000 落盘,回放却找不到目标时段的事件?
高压机器上 73 万条/2 秒的事件量级(4.1 实测)意味着 6 万条限制不到 1 秒就用完——落盘的是「开始后一瞬间」,不是你触发的动作时段。正确姿势:-M 定时窗 + 让动作发生在窗口内,或全程 -w 滚动落盘后回放过滤。
Q3:-C 滚动落盘后找不到文件?
滚动文件命名是「前缀+序号」(roll.scap0/1/2),没有分隔点。用 ls 前缀.scap* 查找(详见 4.6 排障实录)。
Q4:topfiles_bytes/topconns 榜单里没有刚写入的大文件/大流量? 0.41.4 的 table_generator 以 evt.rawarg.res(字节数)为 value 时对 write 事件不聚合(read 正常)。这是实测复现的行为缺陷,规避方案见 4.7 排障实录;排查思路:先用过滤表达式确认事件在文件里,再换 evt.count 型统计或 -p 逐条提取字节数。
Q5:实时事件刷太快看不过来?
三个收窄手段按序使用:① 过滤表达式挂捕获(引擎侧过滤,sysdig "proc.name=nginx");② -n/-M 限量定窗;③ 直接跑对应 chisel(榜单比裸流可读)。都不行就 -w 落盘后回放分析。
Q6:csysdig 在脚本里一跑就崩? csysdig 是交互式 TUI,无 TTY 环境实测直接 core dump(4.8)。自动化场景一律用 sysdig CLI。
七、参考链接
- 官方 Wiki:https://github.com/draios/sysdig/wiki (用户指南、chisel 文档;查询日期 2026-10-27)
- 参数一手来源:
sysdig -h、csysdig -h(0.41.4 实测,本文参数表出处) - chisel 清单:
sysdig -cl(66 个内置脚本与 11 个分类,实测) - 平台内延伸阅读:《Sysdig 介绍与选型指南》(定位与选型)、《Sysdig 安装与初始化实战》(安装与探针,slug zUKX0G1iOuUW)、《Sysdig 配置与过滤器语法详解》(字段与 chisel 体系,slug YZVTewRUBgLP)