操作系统是否可以重新启动一个陷入无限循环的进程?

有一天,当在Linux服务器上进行testing时,我们发现在某些情况下,一个进程可能会死亡,然后再次启动。 检查代码后,我们发现它是由无限循环引起的。

这激起了我的好奇心,这个过程如何消失,然后开始了? 操作系统是否检测并确定exception进程并重新启动? 如果是的话,这是如何工作?

让我们假设你将无法修复你的代码…让我们忽略所有疯狂的选项,如通过脚本附加gdb等。

您可以检查CPU使用情况(大多数意外的无限循环,我已经使用了100%的CPU使用了几个小时:)),或者(更可能是选项)使用strace来检查软件正在做什么,并实现自己的签名跟踪 (如果那20个API重复20次,我们假设无限循环左右)。

例如:

 #!/bin/bash strace -p`cat your_app.pid` | ./your_signature_evaluator # Or strace -p12345 | ./your_signature_evaluator 

至于自动系统识别…看起来正常程序崩溃之后循环调用的东西不受控制(例如malloc()直到你消耗内存,打开文件…),但我(如果我错了)从来没有看到系统(内核)重新启动应用程序。 我认为你已经:

  • 有条件(信号处理,无论)在程序内,有助于恢复
  • 你正在运行一个看门狗(每隔20秒检查一次<pid>正在运行,如果不启动新的实例)
  • 您正在运行的分发包提供服务/程序配置,并在停止重新启动

但是我真的怀疑,Linux对你自己的应用程序是如此的好。

如果可以的话,写这个内核的人就能解决停机问题

PS:Vytor – Web服务器处于无限循环状态,不能使用100%的CPU。