3

ソケット接続をリッスンし、リクエストに応じてさまざまな種類のアクションを実行するサーバーがあります。それらの 1 つは、サーバーが fork する長期データベース クエリです。

サーバーはすべてのアクティブな子のログを保持し、シャットダウンを要求されるたびに、終了する前にすべての子を殺します。サーバーがクラッシュしたり、不当に強制終了されたりして、子プロセスが孤立するという状況に数回遭遇しました。サーバーを再び元に戻そうとすると、そのアドレス/ポートが既にバインドされているため、リッスンしているソケットがバインドできないと言って拒否します。

I am looking for a way to improve this kind of situation, so that the main server process can come back right away. I've tried monitoring the parent existance from the child and exiting as soon at is gone, but this has only resulted in having zombie processes and the socket seems to still be bound.

The server is written in Python, but any explanation or suggestion in any language is welcome.

4

3 に答える 3

2

サーバーをプロセス グループのリーダーにします。その場合、グループ リーダーが終了すると、子プロセスは終了します。

Unix ライクなシステムでテキスト ユーザー インターフェイスが使用されている場合、ログイン セッションを実装するためにセッションが使用されます。単一のプロセス (セッション リーダー) が制御端末と対話して、ユーザーが端末接続を「切断」したときにすべてのプログラムが確実に終了するようにします。(セッション リーダーが不在の場合、端末のフォアグラウンド プロセス グループ内のプロセスがハングアップを処理することが期待されます。)

于 2009-05-15T01:05:44.490 に答える
0

親プロセスが OS に登録された親プロセスにならないように、おそらく fork するときに子プロセスを否認します。親は本当に子供とコミュニケーションをとる必要がありますか?そうでない場合、これはオプションかもしれません。

子プロセスを追跡できますが、方法が異なります。SIGCHLD イベントはもう取得されません。

于 2009-05-14T21:45:27.887 に答える