如何调试处于不间断睡眠状态的进程?

时间:2012-01-25 16:11:25

标签: 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.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,但它没有返回任何内容。说实话,这并不奇怪,因为这个过程(我的猜测)并不是实际上做除了睡觉之外的其他事情,等待一些系统调用返回。

所以,我在想:

  • 有没有办法打印正在运行的进程的当前调用堆栈?
  • 有没有办法在转储时转储进程并查看其调用堆栈?
  • 有关我应该寻找什么的任何建议?我在想一个破损的存储驱动程序(我们最近在存储方面遇到了其他问题),但是责备驱动程序对我来说似乎总是一个懒惰的选择。

1 个答案:

答案 0 :(得分:0)

你不知道吗,我偶然发现了答案。命令为pstack。更多信息请访问:http://linux.die.net/man/1/pstack