我有一个在我的 ubunutu 服务器上运行的 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);
}
}
谢谢