Mercurial > epgrec.yaz
comparison recorder.php @ 169:e379552d084c
fix: recorder.php:???????????????????
| author | epgrec@park.mda.or.jp <yoneda@recorder.localnet.mda.or.jp> |
|---|---|
| date | Sun, 18 Apr 2010 18:06:39 +0900 |
| parents | b307e3749e80 |
| children | c729a68415eb |
comparison
equal
deleted
inserted
replaced
| 167:b307e3749e80 | 169:e379552d084c |
|---|---|
| 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); |
