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

ani*_*nil 27 linux

在Linux中是否有任何命令可以通过它来了解进程是否处于挂起状态.

Dum*_*001 24

在Linux中是否有任何命令可以通过它来了解进程是否处于挂起状态.

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

  • 运行ps以查找被监视进程的PID列表(以及执行时间等)
  • 循环PID
  • gdb使用其PID 开始附加到进程,使用从中转储堆栈跟踪thread apply all where,从进程中分离
  • 如果:
    • 它的堆栈跟踪没有改变,3次检查后时间没有改变
    • 它的堆栈跟踪没有改变,时间表明3次检查后100%的CPU负载
  • 挂起的进程被杀死,以便监视应用程序重新启动挂起的实例.

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

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

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

  • 虽然每个人都很快提到了停机问题,但我喜欢你的回应是如何以工程为导向的。虽然我们确实无法确定任意算术过程 X ** 是否会在完成处理之前完成处理,但我们可以对我们知道的那些进行限制。最好只是解决潜在的问题,但是杀死和重新启动进程并不像你想象的那样肮脏:) (2认同)

RRM*_*RRM 22

你可以查看文件

/proc/[pid]/task/[thread ids]/status
Run Code Online (Sandbox Code Playgroud)


bob*_*nce 6

“挂起状态”是什么意思?通常,无响应的进程使用100%的CPU会陷入无限循环。但是无法确定是否发生了这种情况,或者该过程是否最终不会达到循环退出状态并继续进行。

桌面挂起检测器仅通过向应用程序的事件循环发送消息并查看是否有响应来工作。如果没有足够长的时间,他们会确定该应用已“挂起” ...但是完全有可能它只是在做一些复杂的事情,一旦完成,它很快就会复活。无论如何,这不是您可以用于任何任意过程的东西。