[pgsql-jp: 33741] Re: usogresでzombie プロセス

Kenichirou Kimura (木村健一郎) kimura @ project-com.com
2004年 7月 23日 (金) 10:36:32 JST


木村と申します。

At 23 Jul 2004 04:28:18 +0900,
<hogehoge77 @ excite.co.jp> wrote:
> 
> 吉村と申します。
> 
> usogresを使ってレプリケーションをしているのですが、
> psqlやPHPからWEB経由で接続していると、
> ps -ax|grep usogres
>> 80613  p0  Z      0:00.00  (usogres)
> 80620  p0  Z      0:00.00  (usogres)
> 80622  p0  Z      0:00.00  (usogres)
> 80624  p0  Z      0:00.00  (usogres)
> 80626  p0  Z      0:00.00  (usogres)
> 80628  p0  Z      0:00.00  (usogres)
> 80655  p0  Z      0:00.00  (usogres)
> 80682  p0  Z      0:00.00  (usogres)
> 80706  p0  Z      0:00.00  (usogres)
> 80739  p0  Z      0:00.00  (usogres)
> 80764  p0  Z      0:00.00  (usogres)
> 
> とゾンビなプロセスがどんどん増えてしまいます。
> 何か情報はございませんでしょうか。
> よろしくお願い致します。

これ、私も使っていて気が付きました。要はusogresがforkした子プロセスの
終了をwaitしてないので、接続 → 切断が繰り返されるとどんどんゾンビプロ
セスがたまるようです。

で、適当にパッチをでっち上げてこれで1年ばかり運用してますが問題は起こっ
てないようなので以下のパッチを試していただけますか?ifdef WIN32辺りの
ことを気にせずにFreeBSDで動けばいいや...と作ったので環境によっては動か
ないかもです。

#作者に報告するのをすっかり忘れてた...

--- usogres.cc	Mon Apr 15 22:00:51 2002
+++ usogres.cc.patched	Fri Jul 23 10:28:54 2004
@@ -433,6 +433,7 @@
 
 int main(int argc, char* argv[])
 {
+	int status;
 #ifdef WIN32
 	int Err;
 	WSADATA WsaData;
@@ -498,6 +499,7 @@
 			sleep(1);
 #ifndef WIN32
 		} else if (pid == 0) {
+			if(fork() == 0){
 			sock_serv.close();
 #else
 		} else {
@@ -525,9 +527,14 @@
 			post_obj.open();
 			post_obj.post();
 			exit(0);
+			} else {
+				exit(0);
+			}
 		} else {
 			sl_obj.printf("fork() : ok");
 			new_sock.close();
+			while(wait(&status) !=pid);
+			
 #endif
 		}
 	}


-----------------------------------------------------------------------
木村健一郎(Ken'ichirou Kimura)



pgsql-jp メーリングリストの案内