如何检查进程是否处于挂起状态(Linux)

时间:2010-09-07 13:31:17

标签: linux

Linux中是否有任何命令可以让我知道进程是否处于挂起状态。

4 个答案:

答案 0 :(得分:22)

  

Linux中是否有任何命令可以让我知道进程是否处于挂起状态。

没有命令,但是一旦我不得不做一个非常愚蠢的黑客来完成类似的事情。我写了一个Perl脚本,它定期(在我的情况下每30秒):

  • 运行ps以查找已监视进程的PID列表(以及执行时间等)
  • 循环PID
  • 使用其PID启动gdb附加到进程,使用thread apply all where从中转储堆栈跟踪,从进程中分离
  • 如果以下情况声明了一个进程被挂起:
    • 其堆栈跟踪没有改变,3次检查后时间没有改变
    • 其堆栈跟踪没有改变,时间表示3次检查后100%的CPU负载
  • 挂起进程被终止,以便监视应用程序有机会重新启动挂起的实例。

但这是非常非常粗暴的黑客攻击,为了达到一个即将错过的截止日期,几天之后,在最终安装了错误的应用程序修复后,它被删除了。

否则,由于所有其他响应者都完全正确地评论过,因此无法确定进程是否挂起:只是因为挂起可能由于多种原因而发生,通常绑定到应用程序逻辑。

唯一的方法是应用程序本身能够指示它是否存活。最简单的方法可能是例如定期日志消息“我还活着”。

答案 1 :(得分:21)

你可以查看文件

/proc/[pid]/task/[thread ids]/status

答案 2 :(得分:4)

'悬挂状态'是什么意思?通常,无响应且使用100%CPU的进程陷入无限循环。但是there's no way来确定是否已经发生这种情况,或者该进程是否最终可能无法达到循环退出状态并继续进行。

桌面挂起检测器只需向应用程序的事件循环发送消息并查看是否有任何响应即可。如果没有一段时间他们认为应用程序已经“挂起”......但完全有可能它只是做了一些复杂的事情,并且一旦完成就会恢复生机。无论如何,这不是你可以用于任何任意过程的东西。

答案 3 :(得分:0)

不幸的是,进程没有挂起状态。现在挂起可能会陷入僵局。这是阻止状态。进程中的线程被阻止。其他事情可能是进程正在运行的实时锁定,但一次又一次地做同样的事情。此过程处于运行状态。所以你可以看到没有明确的悬挂状态。 正如所建议的那样,您可以使用top命令查看进程是使用100%CPU还是大量内存。