前几天,在 Linux 服务器上进行测试时,我们观察到在某些情况下,一个进程可能会死掉然后重新启动。检查代码后,我们发现它是由无限循环引起的。
这引起了我的好奇,这个过程是怎么死的,然后又开始了?是操作系统检测并确定异常进程并重新启动它吗?如果是,它是如何工作的?
让我们假设您将无法修复您的代码......让我们忽略所有疯狂的选项,例如gdb
通过脚本附加等。
您可以检查 CPU 使用情况(我所做的大多数意外strace
无限循环使用 100% 的 CPU 数小时 :)),或者(更可能的选择)用于检查软件现在正在做什么并实施您自己的签名跟踪(如果这 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。