2011-06-29 48 views
1

我有一個長期運行的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擴展。

+1

我不認爲在Windows上有一個*支持的* API可以做到這一點,儘管只要鏈中沒有中斷,就可以這樣做。 (也就是說,每個過程只有一個家長參考,如果被監控過程的孩子生孩子,然後過程的孩子終止自己,孩子的孩子將顯示爲不是父母) –

回答

1

下面是一個簡單的shell腳本的解決方案:

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

這打印出的PID的子進程。

我不知道可以獲取該信息的標準Python模塊。 pgrep/proc獲取信息,所以你可以在Python中重新實現,但我懷疑它是否值得。

0

C++標準不知道多進程系統。因此,沒有用於與流程交互的API。 (畢竟,標準將如何在8位微控制器上強制使用多進程系統?)

此外,某些平臺(例如Windows NT上的Win32子系統)不會跟蹤進程父子關係。 (新臺幣在引擎蓋下,但你必須調用無證API來獲取信息)

我很確定POSIX確實定義了這樣的API,但我自己並沒有使用它們。