Mercurial > epgrec.yaz
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); |