有一天,当在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()
直到你消耗内存,打开文件…),但我(如果我错了)从来没有看到系统(内核)重新启动应用程序。 我认为你已经:
<pid>
正在运行,如果不启动新的实例) 但是我真的怀疑,Linux对你自己的应用程序是如此的好。
如果可以的话,写这个内核的人就能解决停机问题
PS:Vytor – Web服务器处于无限循环状态,不能使用100%的CPU。