2009-05-12 18 views
9

私はPHPスクリプトを実行するcronジョブを持っています。 cronは毎分実行するように設定されていますが、これはテスト目的でのみ実行されます。実行中のPHPスクリプトは、ユーザーがサーバーにアップロードしたビデオをフラッシュフォーマット(例:... .flv)に変換するように設計されています。スクリプトは手動でコマンドラインで実行するとうまく実行されますが、cronで実行するとうまく始まりますが、1分後には停止します。cronジョブは最後のcron実行を強制終了しますか?

次のcronが実行されると、最後のcronの実行が「殺される」ようです。 私は、次のPHP機能を追加しました:それは最後の実行を中止しないことを期待して

ignore_user_abort(true); 

を、しかし私は、ビデオの変換が引き継ぐことが、正常に動作します5分ごとに実行するようにcronを設定するテスト私はなぜ別のcronが実行されると停止するのかを理解する必要があるので5分です。

ご協力いただければ幸いです。

ありがとうございました!

EDIT: 私のcronのは、次のようになります。

*/1 * * * * php /path_to_file/convert.php 
+0

PHPエラーログを確認しましたか?時間制限を0に設定するためにset_time_limitを使用しましたか? –

+0

エラーが表示されず、制限時間も0に設定されています。 私のcronは次のように書かれています:

 */1 * * * * php /path_to_file/convert.php 
ありがとう! –

+0

cronジョブは最後に作業していたものを上書きしないようですが、PHPコードに何か不具合がありました。私は、Sanderが言及した一時的なロックファイルを追加しても、完璧に動作することを確認するためのチェックを追加しました。 ありがとう! –

答えて

17

私はcronがプロセスを殺したとは思わない。しかし、cronは長時間実行されるプロセスにはあまり適していません。ここで起こっていることは、スクリプトが複数回実行されたときにスクリプト全体が踏みとどまることです。たとえば、両方のPHPプロセスが同時に同じファイルに書き込もうとしている可能性があります。

まず、PHPエラーログを調べるだけでなく、PHPファイル自体の出力をキャプチャするようにしてください。たとえば、

*/1 * * * * * php /path/to/convert.php & >> /var/log/convert.log 

単純なロックファイルを使用して、convert.phpが複数回実行されないようにすることもできます。次のようなもの:

if (file_exists('/tmp/convert.lock')) { 
    exit(); 
} 

touch('/tmp/convert.lock'); 
// convert here 
unlink('/tmp/convert.lock'); 
+3

cronはプロセスを強制終了しません。スクリプト(またはスクリプトが呼び出すもの)がそれ自身の方法で取得しています。 –

3

cron自体は問題がある場合は、それをやって、あなたのPHPで何かがほぼ確実にありますので、実行中のジョブの前のインスタンスを停止することはありません。そのコードを投稿する必要があります。

1

いいえ、そうではありません。各実行でスクリプトがチェックするロックファイルを作成することで、第2のプロセスの実行を停止することができます。ファイルが存在する場合、ファイルは実行されません。これは、必要に応じて、最大実行時間とともに使用して、あるプロセスが将来の実行を無期限に停止させないようにする必要があります。ロックファイルは、単に/tmp/foo.lockという空のプレーンテキストファイルにすることができます。

関連する問題