首页/系统/Linux 运维命令速查/场景:进程卡死用 strace 定位
进程与作业69 条

场景:进程卡死用 strace 定位

服务不响应但没崩:attach 看它现在停在哪个系统调用(网络?磁盘?锁?),几十秒就能给出方向。

Linux 运维命令速查系统更新于 2026-10-13

进程卡死定位是什么场景

服务不响应但进程还在、CPU 不高、日志也没有报错,这类假死最难查。原因是进程其实还活着,只是卡在某个系统调用上:等网络对端回包、等磁盘 IO 完成、或者等一把锁。最快的办法是把进程当前的系统调用直接打出来看,再对照内核记录的等待点,几分钟内就能判断卡在哪一类操作上,比对着代码猜快得多。生产环境要注意抓取时间必须短。

基本信息

适用平台GNU/Linux(strace 与 /proc 文件系统)
场景进程假死、无响应但未退出
组合手段跟踪系统调用加对照内核等待点
常用约束限定跟踪类别、限制输出、外部超时包住
等待点来源/proc/进程号/wchan 与进程状态字段
注意事项跟踪会短暂暂停目标进程

典型使用场景

  • 健康检查失败但进程仍在、端口仍处于监听状态。
  • 请求长时间无响应,日志停在某一步没有后续。
  • 排查死锁嫌疑:进程占用 CPU 极低但完全不动。
  • 区分卡在磁盘还是网络,缩小排查范围。
  • 上线前验证风险操作是否会被锁阻塞。

快速看现场

快速看现场
pid=$(pgrep -f 'app-server' | head -1)                 # 定位进程号
cat /proc/$pid/wchan; echo                             # 内核等待点,无需跟踪工具
timeout 5 strace -f -p $pid -e trace=network -s 128 2>&1 | tail -30
timeout 5 strace -f -p $pid -e trace=read,write,openat 2>&1 | tail -20
ps -o pid,stat,wchan:20,cmd -p $pid                    # 状态与等待点一起看
timeout 5 strace -f -p $pid -c 2>&1 | tail -20         # 系统调用耗时统计

现象与方向对照

观察到的现象含义处理方向
停在等待事件调用事件循环空闲通常没有流量,不是故障
停在读或写调用对端慢或大块 IO检查下游服务与磁盘
停在锁相关调用锁竞争或死锁嫌疑检查锁等待与线程栈
等待点为空正在用户态执行关注 CPU 占用与线程状态
输出为空权限或能力不足补充跟踪权限后重试
跟踪工具会让目标进程短暂停下,生产上必须用外部超时包住并把时间控制在几秒;长时间挂着的风险很高。
跟踪输出默认写到标准错误:管道处理时要显式重定向,否则会以为命令没有任何输出。
容器里可能缺少跟踪所需的权限或能力,需要额外授权;没有跟踪工具时,内核等待点文件同样能给出方向。

易错点

  • 长时间挂着跟踪命令,目标进程被反复暂停,本来只是慢的服务变成真的不可用。
  • 在管道中忘记重定向标准错误,看不到跟踪结果,误判为进程没有任何动作。
  • 不看进程状态就下结论:状态为不可中断等待时,问题在 IO 而不在网络。
  • 容器内缺少跟踪权限却反复尝试浪费时间;应先确认权限或用等待点文件替代。

数据来源与参考

  • man 1 strace(strace 官方手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌