先日、Linux サーバーでテストを行っているときに、ある条件下で 1 つのプロセスが停止し、その後再び開始する可能性があることを確認しました。コードを確認したところ、無限ループが原因であることがわかりました。
これは、プロセスがどのように停止してから開始されたのか、私の好奇心をかき立てました。異常なプロセスを検出して判断し、再起動させるのはOSですか?はいの場合、それはどのように機能しますか?
コードを修正できないとしましょう...そして、gdb
スクリプト経由でアタッチするなどのクレイジーなオプションはすべて無視しましょう。
CPU 使用率をチェックすることができます (私が行ったほとんどの偶発的strace
な無限ループは、CPU の 100% を何時間も使用しました :))、または (より可能性の高いオプション) を使用して、ソフトウェアが現在何をしているかをチェックし、独自の署名トレースを実装します(これらの 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 サーバーは無限ループにあり、CPU を 100% 使用していません。