我经常想知道为什么管道中间的进程正在休眠而不忙于处理数据。我目前的方法是:
- 找到
pid
感兴趣的 sudo strace -pt pid
获取阻塞系统调用和对象(fd、child、futex 等)- 点击Ctrlc以分离 strace
- 查找适当的对象
/proc/pid
grep /proc/
或用于lsof
查找正在等待的管道或进程的另一端- 用新的从 #1 重复
pid
这是一个相当缓慢的过程,结合了许多不能很好地协同工作的工具(strace
特别是很难自动化)。是否有一种工具可以为我执行此循环并绘制出进程的等待链,或者至少使一次迭代不那么尴尬?
Linux 3.2、Ubuntu LTS 12、x64、VirtualBox 下(如果有的话)。
答案1
大多数ps
现在都包含一个树选项,或者一个非常恰当的名称相关实用程序,ptree
.
由于我当前的工作系统没有ptree,我目前使用
ps fauw
我想我也有一个
ps taux (t making more sense than f)
最后,有些 ps 还可以选择在视图中包含程序线程。
虽然这不是您(和我)希望的自动化解决方案,但我的经验是,进程树中会出现一系列“可能的嫌疑人”,只需扫描树,您通常就可以猜测问题出在哪里。
IHTH