这是在Linux系统(Red Hat发行版)上。
我编写了一个Perl实现的守护进程。它监视一个作业表格,当发现新的作业时,就fork出一个子进程来执行该作业。
我发现子进程在进程表中处于不可中断状态而挂起:
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
,但它没有返回任何结果。说实话,这并不奇怪,因为根据我的猜测,该进程实际上除了睡眠等待某个系统调用返回外,什么都不做。
所以,我在想:
- 有没有办法打印正在运行进程的当前调用堆栈?
- 有没有办法转储一个进程并在转储时查看其调用堆栈?
- 您有什么建议应该寻找什么?我在考虑是损坏的存储驱动程序(我们最近遇到了其他存储问题),但总是把责任归咎于驱动程序似乎对我来说是一种懒惰的选择。