私は、動作の一部としてPostgresサーバを起動および停止する長時間実行するPythonプログラムを持っています。 pg_ctl -m fast
をスポーンするためにサブプロセスを使用してサーバーを停止します。フォールバックとして、私は戻りコードをチェックし、失敗した場合はpg_ctl -m immediate
を実行します。子プロセスの子プロセスをどのように識別できますか?
問題は両方とも失敗することがあります。私はこれを自分で再現することはできませんでしたが、私のプログラムのユーザーにとってはある頻度で起こります。私はpg_ctl呼び出しからstdout/stderrを記録しますが、そこには有用な情報はありません。私が知る限り、マスタプロセスまたはその子プロセスのいずれかがSIGQUITに応答しなくなり、それらを終了する唯一の方法はSIGKILLであり、pg_ctlはこれを使用しません。
私は基本的にPostgres側でアイデアを使い果たしました。私はPostgres 8.3を使用しているので、最近のバージョンにアップグレードするとこれが解決されるはずですが、残念ながらそれは私の選択肢ではありません。私が思いつくことができる唯一の解決策は、子供たちを手動で殺すことです。しかし私はpg_ctl start
によって生まれた子どもたちと、マシン上で動作している他のpostgres
のプロセスを区別する方法を知らない。
私が産んだ別のプロセスの子としてプロセスを識別する方法はありますか? Pythonからこれを行うクロスプラットフォームの方法が理想的でしょうが、Windows/Linux/UNIX上にAPIがあればC拡張を書くつもりです。
Windowsでこれを行う*サポートされている* APIはないと思いますが、チェーンに途切れがない限りは可能です。 (つまり、各プロセスには親参照のみがあり、監視されたプロセスの子プロセスが子プロセスを作成し、プロセスの子プロセスが終了すると、子コンポーネントの子プロセスは親プロセスとして表示されません) –