diff recorder.php @ 170:1c4558d1a449

merged with upstream
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Sun, 18 Apr 2010 22:48:48 +0900
parents e379552d084c
children c729a68415eb
line wrap: on
line diff
--- a/recorder.php	Fri Apr 16 19:08:58 2010 +0900
+++ b/recorder.php	Sun Apr 18 22:48:48 2010 +0900
@@ -56,14 +56,11 @@
 	return false;
 }
 
-// 指定したプロセスハンドルが生成した子プロセスのpidリストを返す
+// 指定したプロセスIDが生成した子プロセスのpidリストを返す
 // こういうやり方しかないのか?
 //
-function epgrec_childproc( $p )
+function epgrec_childproc( $ppid )
 {
-	$st = proc_get_status( $p );
-	$ppid = $st['pid'];
-	
 	// ps を実行する
 	$d = array(
 			0 => array( 'file','/dev/null','r' ),
@@ -88,6 +85,12 @@
 	fclose( $pipes[1] );
 	proc_close( $ps );
 	
+	foreach( $cpids as $p ) {
+		$ccpids = epgrec_childproc( $p );
+		foreach( $ccpids as $ccpid ) {
+			array_push( $cpids, $ccpid );
+		}
+	}
 	return $cpids;
 }
 
@@ -100,8 +103,8 @@
 		system( "ps ax >>".$logfile );
 		system( "echo ------- >>".$logfile );
 	}
-	
-	$cpids = epgrec_childproc( $p );
+	$status = proc_get_status( $p );
+	$cpids = epgrec_childproc( $status['pid'] );
 	
 	if( DEBUG ) {
 		 global $logfile;
@@ -112,12 +115,13 @@
 		system( "echo ------- >>".$logfile );
 	}
 	
+	// 親から止める
 	@proc_terminate( $p );
-	sleep(1);
+	usleep(500*1000);
 	@proc_terminate( $p );	// 2度送る
 	
 	foreach( $cpids as $cpid ) {
-		$ret = posix_kill( $cpid, SIGTERM );	// sigterm
+		$ret = posix_kill( $cpid, SIGTERM );		// sigterm
 		usleep(100*1000);
 		if( ! $ret ) posix_kill( $cpid, SIGKILL );	// sigkill
 	}
@@ -128,10 +132,12 @@
 		system( "echo ------- >>".$logfile );
 	}
 	
+	/* プロセスがしばらく居残る場合がある
 	foreach( $cpids as $cpid ) {
 		$ret = posix_kill( $cpid, SIGTERM );	// sigterm
-		if( $ret ) return false;	// 恐らくプロセスが存在するのでエラー
+		if( $ret ) return false;				// 恐らくプロセスが存在するのでエラー
 	}
+	*/
 	return true;	// 保証できない
 }
 
@@ -226,7 +232,6 @@
 	if( time() < $endtime ) {
 		$rrec->endtime = toDatetime( time() );
 	}
-	
 	// 完了フラグを立てておく
 	$rrec->complete = '1';