ubuntuサーバーで実行されるphpスクリプトがあります。このスクリプトは、クエリを実行して統計を収集する無限ループで実行されます...これは、他のサービスの監視です。60 秒ごとに、収集された統計が json オブジェクトとして .js ファイルにダンプされます。.js ファイルは別の場所で監視されており、私の質問では重要ではありません。
スクリプトを実行すると、stdout と stderr の両方がログ ファイルにリダイレクトされます。ほとんどの場合、標準またはエラーの出力がないため、ログは空のままになります。
もちろん、場合によっては出力があります。昨夜私が経験した問題は、何らかの理由でスクリプトが失敗し、ログ ファイルがパーティション全体を埋めてしまい、サーバーの安定性を台無しにしてしまったことです。
私がやったこと..またはやろうとしたことは、60秒ごとに(統計がダンプされるとき)スクリプトがログファイルのサイズをチェックするという簡単なチェックを追加することです..サイズがX mbより大きい場合、基本的にファイルを空にして、ロギングを続行できるようにします。スクリプトで再び問題が発生した場合に、ログ ファイルでパーティション全体がいっぱいにならないようにするためです。
ログ ファイルのサイズを正常に検出でき、設定したサイズに達したときに正常にクリアできますが、次に STDOUT または STDERR の書き込みが発生したときに、以前のすべてのデータが一度にダンプされます。
これに関するご支援をいただければ幸いです。
スクリプトの呼び出し:
php checker.php &> log
しかし、試してみました
php checker.php > log 2>&1
また、スクリプトの開始時にストリームをリダイレクトします
close(STDOUT);
fclose(STDERR);
$STDOUT = fopen($LOG_FILE_LOCATION, 'wb');
$STDERR = fopen($LOG_FILE_LOCATION, 'wb');
どちらの方法でも同じ出力が生成されます。
コードクリアログファイル
function CheckLogFilesize($file)
{
global $LOG_FILE_LOCATION;
global $MAX_LOG_SIZE_MB;
$max_log_size_bytes = $MAX_LOG_SIZE_MB * 1024 * 1024;
$size = exec('stat -c %s ' . $file);
// If log file size is too large.. reset it.
if (intval($size) > $max_log_size_bytes)
{
flush();
// Clear the log
$fp = fopen($file, 'w');
fwrite($fp, '');
fclose($fp);
}
}
ありがとう