comparison 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
comparison
equal deleted inserted replaced
168:4dee3368df63 170:1c4558d1a449
54 if( is_resource( $p ) ) return $p; 54 if( is_resource( $p ) ) return $p;
55 55
56 return false; 56 return false;
57 } 57 }
58 58
59 // 指定したプロセスハンドルが生成した子プロセスのpidリストを返す 59 // 指定したプロセスIDが生成した子プロセスのpidリストを返す
60 // こういうやり方しかないのか? 60 // こういうやり方しかないのか?
61 // 61 //
62 function epgrec_childproc( $p ) 62 function epgrec_childproc( $ppid )
63 { 63 {
64 $st = proc_get_status( $p );
65 $ppid = $st['pid'];
66
67 // ps を実行する 64 // ps を実行する
68 $d = array( 65 $d = array(
69 0 => array( 'file','/dev/null','r' ), 66 0 => array( 'file','/dev/null','r' ),
70 1 => array( 'pipe','w' ), 67 1 => array( 'pipe','w' ),
71 2 => array( 'file','/dev/null','w' ), 68 2 => array( 'file','/dev/null','w' ),
86 } 83 }
87 } 84 }
88 fclose( $pipes[1] ); 85 fclose( $pipes[1] );
89 proc_close( $ps ); 86 proc_close( $ps );
90 87
88 foreach( $cpids as $p ) {
89 $ccpids = epgrec_childproc( $p );
90 foreach( $ccpids as $ccpid ) {
91 array_push( $cpids, $ccpid );
92 }
93 }
91 return $cpids; 94 return $cpids;
92 } 95 }
93 96
94 // 指定したプロセスハンドルを子プロセスを含め終了させる 97 // 指定したプロセスハンドルを子プロセスを含め終了させる
95 98
98 if( DEBUG ) { 101 if( DEBUG ) {
99 global $logfile; 102 global $logfile;
100 system( "ps ax >>".$logfile ); 103 system( "ps ax >>".$logfile );
101 system( "echo ------- >>".$logfile ); 104 system( "echo ------- >>".$logfile );
102 } 105 }
103 106 $status = proc_get_status( $p );
104 $cpids = epgrec_childproc( $p ); 107 $cpids = epgrec_childproc( $status['pid'] );
105 108
106 if( DEBUG ) { 109 if( DEBUG ) {
107 global $logfile; 110 global $logfile;
108 111
109 foreach( $cpids as $cpid ) { 112 foreach( $cpids as $cpid ) {
110 system( "echo ".$cpid." >>".$logfile ); 113 system( "echo ".$cpid." >>".$logfile );
111 } 114 }
112 system( "echo ------- >>".$logfile ); 115 system( "echo ------- >>".$logfile );
113 } 116 }
114 117
118 // 親から止める
115 @proc_terminate( $p ); 119 @proc_terminate( $p );
116 sleep(1); 120 usleep(500*1000);
117 @proc_terminate( $p ); // 2度送る 121 @proc_terminate( $p ); // 2度送る
118 122
119 foreach( $cpids as $cpid ) { 123 foreach( $cpids as $cpid ) {
120 $ret = posix_kill( $cpid, SIGTERM ); // sigterm 124 $ret = posix_kill( $cpid, SIGTERM ); // sigterm
121 usleep(100*1000); 125 usleep(100*1000);
122 if( ! $ret ) posix_kill( $cpid, SIGKILL ); // sigkill 126 if( ! $ret ) posix_kill( $cpid, SIGKILL ); // sigkill
123 } 127 }
124 128
125 if( DEBUG ) { 129 if( DEBUG ) {
126 global $logfile; 130 global $logfile;
127 system( "ps ax >>".$logfile ); 131 system( "ps ax >>".$logfile );
128 system( "echo ------- >>".$logfile ); 132 system( "echo ------- >>".$logfile );
129 } 133 }
130 134
135 /* プロセスがしばらく居残る場合がある
131 foreach( $cpids as $cpid ) { 136 foreach( $cpids as $cpid ) {
132 $ret = posix_kill( $cpid, SIGTERM ); // sigterm 137 $ret = posix_kill( $cpid, SIGTERM ); // sigterm
133 if( $ret ) return false; // 恐らくプロセスが存在するのでエラー 138 if( $ret ) return false; // 恐らくプロセスが存在するのでエラー
134 } 139 }
140 */
135 return true; // 保証できない 141 return true; // 保証できない
136 } 142 }
137 143
138 ////// ここから本編 144 ////// ここから本編
139 145
224 230
225 // 予定より短いようなら終了時間を現在に書き換える 231 // 予定より短いようなら終了時間を現在に書き換える
226 if( time() < $endtime ) { 232 if( time() < $endtime ) {
227 $rrec->endtime = toDatetime( time() ); 233 $rrec->endtime = toDatetime( time() );
228 } 234 }
229
230 // 完了フラグを立てておく 235 // 完了フラグを立てておく
231 $rrec->complete = '1'; 236 $rrec->complete = '1';
232 237
233 // ちょっと待った方が確実っぽい 238 // ちょっと待った方が確実っぽい
234 sleep(15); 239 sleep(15);