Linux 如何调试处于不间断睡眠状态的进程?
这是在Linux系统上(Red Hat发行版) 我用Perl实现了一个守护进程。它监视一个作业表,当它找到一个新的作业时,它会派生一个子作业来执行作业 我发现孩子们以不可中断的状态在进程表中徘徊:Linux 如何调试处于不间断睡眠状态的进程?,linux,process,sleep,Linux,Process,Sleep,这是在Linux系统上(Red Hat发行版) 我用Perl实现了一个守护进程。它监视一个作业表,当它找到一个新的作业时,它会派生一个子作业来执行作业 我发现孩子们以不可中断的状态在进程表中徘徊: 682 16658 100 dumpdeco dumpdeco ? 0:27.62 0.0 1.8 D perl /root/runObjectBrowserJobs.pl 1453 16658 100 dumpdeco dumpdeco ? 0:13.
682 16658 100 dumpdeco dumpdeco ? 0:27.62 0.0 1.8 D perl /root/runObjectBrowserJobs.pl
1453 16658 100 dumpdeco dumpdeco ? 0:13.34 0.0 1.5 D perl /root/runObjectBrowserJobs.pl
1458 16658 100 dumpdeco dumpdeco ? 0:12.42 0.0 1.5 D perl /root/runObjectBrowserJobs.pl
1467 16658 100 dumpdeco dumpdeco ? 0:13.35 2.9 1.8 D perl /root/runObjectBrowserJobs.pl
1474 16658 100 dumpdeco dumpdeco ? 0:14.31 0.0 2.1 D perl /root/runObjectBrowserJobs.pl
1479 16658 100 dumpdeco dumpdeco ? 0:13.73 0.0 2.1 D perl /root/runObjectBrowserJobs.pl
1496 16658 100 dumpdeco dumpdeco ? 0:13.97 0.0 2.0 D perl /root/runObjectBrowserJobs.pl
1499 16658 100 dumpdeco dumpdeco ? 0:13.93 0.0 2.2 D perl /root/runObjectBrowserJobs.pl
1501 16658 100 dumpdeco dumpdeco ? 0:14.47 0.0 1.4 D perl /root/runObjectBrowserJobs.pl
1503 16658 100 dumpdeco dumpdeco ? 0:14.86 2.0 2.2 D perl /root/runObjectBrowserJobs.pl
1505 16658 100 dumpdeco dumpdeco ? 0:13.88 1.0 2.0 D perl /root/runObjectBrowserJobs.pl
1520 16658 100 dumpdeco dumpdeco ? 0:14.39 0.0 1.5 D perl /root/runObjectBrowserJobs.pl
1522 16658 100 dumpdeco dumpdeco ? 0:14.12 1.0 1.8 D perl /root/runObjectBrowserJobs.pl
1531 16658 100 dumpdeco dumpdeco ? 0:16.45 0.0 1.7 D perl /root/runObjectBrowserJobs.pl
3619 16658 100 dumpdeco dumpdeco ? 2:03.59 0.0 4.5 D perl /root/runObjectBrowserJobs.pl
我从日志中知道孩子们已经完成了分配给他们的工作。他们已对此进行了记录,作业已从挂起队列中删除。所以,从代码检查来看,除了退出,他们没有什么可做的了
这似乎是一种新现象。这是一段古老的代码,我已经完成了僵尸进程之舞,所以我很确定这不是错误收获的问题
我想弄清楚的是,如何找出这些过程所依赖的东西。我尝试了strace
,但它没有返回任何内容。老实说,这并不奇怪,因为这个过程(我猜)实际上除了睡觉,等待一些系统调用返回之外,什么都没有做
所以,我在想:
- 是否有方法打印正在运行的进程的当前调用堆栈
- 是否有方法转储进程并在转储时查看其调用堆栈
- 关于我应该寻找什么,有什么建议吗?我在想一个坏了的存储驱动程序(最近我们的存储出现了其他问题),但对我来说,责备驱动程序似乎总是一个懒惰的选择
- 你难道不知道吗,我偶然发现了答案。命令是
pstack
。这里有更多信息:我想看看存储设备。状态为D的进程通常表示它们正在等待IO。由于进程本身没有发生任何事情(IO是内核区),因此strace不会显示任何使用gdb实现的.pstack,并且在尝试连接到我的不间断进程时两者都会挂起