[Momonga-devel.ja:01204] OmoiKondara でビルドするとdefunctになるパッケージがありました


ずんだあん です

年末年始の休み中に、パッケージの全リビルドを試みてみたのですが、
OmoiKondara (v. 1.93) を使って
  ../tools/OmoiKondara -f gcc2.96
あるいは
  ../tools/OmoiKondara -f -v gcc2.96
として gcc2.96 をビルドすると、rpmbuildがdefunct になるようです。具体的
には、rpmbuildが終了した後も、220行目の
  s = pipe[0].gets
がブロックされてしまっていることが、^Cを押した時のトレースバックからわか
ります。(どうして以前はうまくいったのだろう?)

対症療法として、いまのところ、OmoiKondara を以下のように変更して、ある時
間、子プロセスから文字が流れてこなかったらそのプロセスが生きているか確認
するようにしてみました。

今のところこれでgcc2.96も無事にできあがるようになったのですが、本質的な
解決方法ではないような気も…。

以上、ご報告まで。

Index: OmoiKondara
===================================================================
RCS file: /home/cvs/tools/OmoiKondara,v
retrieving revision 1.93
diff -u -r1.93 OmoiKondara
--- OmoiKondara	2002/12/26 02:56:28	1.93
+++ OmoiKondara	2003/01/08 17:36:06
@@ -1,6 +1,7 @@
 #!/usr/bin/env ruby
 
 require 'getoptlong'
+require 'timeout'
 begin
   require 'rpmmodule'
   $CANNOTSTRICT = false
@@ -190,6 +191,20 @@
   end
 
 =begin
+--- IO::gets_with_timeout (sec)
+getsするが、sec秒以内に終了しない場合にはTimeoutErrorをraiseする。
+=end
+  class IO
+    def gets_with_timeout (sec)
+      r = ''
+      timeout (sec) do
+        r = gets
+      end
+      r
+    end
+  end
+
+=begin
 ---  exec_command(command)
 引数で指定されたコマンドを実行し、出力をログに記録する。
 =end
@@ -217,12 +232,16 @@
         end
         pipe[1].close
 
-        while s = pipe[0].gets do
-          print s if $VERBOSEOUT
-          fLOG.print s
+        begin
+	  while s = pipe[0].gets_with_timeout (60) do
+	    print s if $VERBOSEOUT
+	    fLOG.print s
+	  end
+	  Process.waitpid(pid)
+        rescue TimeoutError
+          retry until Process.waitpid(pid, Process::WNOHANG)
         end
       ensure
-        Process.waitpid2(pid)
         status = $?
         pipe[0].close
       end