4

先日、Linux サーバーでテストを行っているときに、ある条件下で 1 つのプロセスが停止し、その後再び開始する可能性があることを確認しました。コードを確認したところ、無限ループが原因であることがわかりました。

これは、プロセスがどのように停止してから開始されたのか、私の好奇心をかき立てました。異常なプロセスを検出して判断し、再起動させるのはOSですか?はいの場合、それはどのように機能しますか?

4

2 に答える 2

4

コードを修正できないとしましょう...そして、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()、メモリを使い果たすまで、ファイルを開くまで...)プログラムがクラッシュするのは正常なようですが、私は(間違っている場合はコメントで訂正してください) システム (カーネル) がアプリを再起動するのを見たことがありません。あなたは次のいずれかをしたと思います:

  • プログラム内に回復に役立つ条件(シグナル処理など)がある
  • ウォッチドッグを実行しています(実行中の20秒ごとにチェック<pid>し、そうでない場合は新しいインスタンスを開始します)
  • 停止した場合に再起動するサービス/プログラム構成を提供するディストリビューションを実行している

しかし、Linux がそれ自体であなたのアプリケーションにとって素晴らしいものになるとは思えません。

于 2013-04-27T08:12:57.490 に答える
0

そのカーネルを書いた人が停止問題を解決できれば

PS: Vytor - Web サーバーは無限ループにあり、CPU を 100% 使用していません。

于 2013-04-27T08:24:24.833 に答える