我有一個長期運行的Python程序,它啓動和停止Postgres服務器作爲其操作的一部分。我通過使用子進程來產生pg_ctl -m fast
來停止服務器。作爲回退,我檢查返回代碼,如果失敗,我運行pg_ctl -m immediate
。如何識別兒童進程的孩子?
問題是,有時兩個都失敗了。我自己無法重現這一點,但是對於我的程序用戶而言,這種情況發生頻率很高。我從pg_ctl調用中記錄stdout/stderr,但是在那裏沒有得到任何有用的信息。據我所知,無論是主進程還是其子進程都停止了對SIGQUIT的響應,並且終止它們的唯一方法是使用pg_ctl不使用的SIGKILL。
我已經基本用盡了Postgres方面的想法。我使用的是Postgres 8.3,所以我確定升級到更新的版本可以解決這個問題,但不幸的是,這不是我的選擇。我能想出的唯一解決方案是手動殺死孩子。但我不知道如何區分我的pg_ctl start
和其他postgres
進程可能在機器上運行的子進程。
是否有辦法將進程識別爲我產生的另一個進程的子進程?一個跨平臺的方法從Python做到這一點是理想的,但如果在Windows/Linux/UNIX上存在API來做到這一點,我願意編寫一個C擴展。
我不認爲在Windows上有一個*支持的* API可以做到這一點,儘管只要鏈中沒有中斷,就可以這樣做。 (也就是說,每個過程只有一個家長參考,如果被監控過程的孩子生孩子,然後過程的孩子終止自己,孩子的孩子將顯示爲不是父母) –