2016-12-09 32 views
1

Linuxでいくつかのコマンドを起動するためにexecを使用するPHPスクリプトがあります。それは5分後に死ぬことになっている単純なwgetです。私が直面している問題は、wgetの実際のPIDを殺すまでスクリプトが実行されていないのでControl + cを実行している場合です。私はpcntl_signalを使って、exec/system/shell_execなどを使ってみましたが、どれも働いていませんでした。私が使用していたコードは次のとおりです。すべてのPHPスクリプトがコントロールで死ぬことはありません

<?PHP 
system('/usr/bin/timeout 300 wget -c --tries=0 --read-timeout=200 -O /tmp/ll.mp3 http://15323.live.streamtheworld.com:80/WABCAM_SC'); 
?> 
+0

これは、 'wget'ではなく'/usr/bin/timeout'を強制終了するからだと思います。 'pcntl_signal'コードを共有するのを忘れた: - ? –

+0

それは(私はちょうどタイムアウトを殺している)妥当と思われる。私はPHPでset_time_limitを使用したかったが、それは私のスクリプト全体を殺すだろう。私はwgetがX時間後に終了するようにしたい。また、私のpcntlコードを以下で見ることができます。 –

答えて

0

まず、あなたは(manual page for pcntl_signalを参照)、それはPHP 4.3.0以降で動作するようにticks directiveを宣言しなければなりません。

信号を登録し、信号を受信したときに呼び出されるコールバック関数を登録する必要があります。あなたの場合、CTRL + Cが押されたときに生成される信号SIGINTが必要です。

declare(ticks = 1); 

// callback function called when signal is received 
function shutdown($signal) 
{ 
    echo 'Interrupted using CTRL + C'; 

    // you probably don't need this condition, just exit should be enough 
    if (($signal === SIGINT)) { 
     exit; 
    } 
} 

// register the callback function for the specific signal 
// SIGINT in this case is generated when you press CTRL + C 
pcntl_signal(SIGINT, 'shutdown'); 
+0

[root @ m-n〜]#php /tmp/l.php PHP致命的なエラー:11行目の/tmp/l.phpにクラス 'Process_Sync'が見つかりません [root @ m-n〜]# –

+0

編集されました。今すぐお試しください。 –

+0

以下はうまくいきませんでした。 <?PHP declare(ticks = 1); function shutdown($ signal) { echo 'CTRL + Cで中断されました'; //この条件は必要ありません。終了するだけで十分です。 if(($ signal === SIGINT)){ exit; }} //あなたはCTRL + C pcntl_signal(SIGINT、 'シャットダウン')を押したときに、この場合の具体的な信号 // SIGINTが発生したため、コールバック関数を登録します。 システム( '/ usr/bin/timeout 3610 wget --tries = 0 --read-timeout = 200 -O /l.mp3 http://myurl.com:80/_SC'); ?> –

関連する問題