2011-06-29 11 views
1

私は、動作の一部として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拡張を書くつもりです。

+1

Windowsでこれを行う*サポートされている* APIはないと思いますが、チェーンに途切れがない限りは可能です。 (つまり、各プロセスには親参照のみがあり、監視されたプロセスの子プロセスが子プロセスを作成し、プロセスの子プロセスが終了すると、子コンポーネントの子プロセスは親プロセスとして表示されません) –

答えて

1

は、簡単なシェルスクリプトソリューションです:

pgrep -P $(head -1 $PGDATA/postmaster.pid) 

これは、子プロセスのPIDを出力します。

私は、その情報を取得できる標準のPythonモジュールを認識していません。 pgrep/procから情報を取得するので、Pythonでそれを再実装することができますが、それはそれが価値があるとは思っていません。

0

C++標準では、マルチプロセスシステムについては認識していません。したがって、プロセスと対話するためのAPIはありません。 (結局のところ、標準では8ビットマイクロコントローラ上でマルチプロセスシステムをどのように要求するのだろうか)。

さらに、Windows NT上のWin32サブシステムなどのプラットフォームによっては、プロセスの親子関係が追跡されないものがあります。 (NTは本格的ですが、情報を得るためには文書化されていないAPIを呼び出さなければなりません)

POSIXはこのようなAPIを定義していますが、自分で使っていません。ここで

関連する問題