サーバーの負荷をチェックするこのスクリプトがあります。負荷が高すぎる場合、および/またはブラウザからスクリプトにアクセスした場合、スクリプトは実行中のすべてのプロセスを取得します。
負荷が高すぎて、スクリプトが cron ジョブから実行される場合、実行中のプロセスがメールで送られてきます。
私の問題は次
のとおりです。負荷が高すぎて、スクリプトがcronジョブから実行されると、service httpd fullstatus
何も返されません。そのため、負荷を示すメールを受け取ります。そしてps auxO-C | head
、電子メールにも表示されます。しかし、それだけではありませんservice httpd fullstatus
ブラウザからスクリプトを実行すると、負荷が高すぎるかどうかに関係なく、service httpd fullstatus
両方ps auxO-C | head
とも正常に表示されます。
これがなぜなのか理解できません...助けてもらえますか?どこかにタイプミスがありますか、またはいくつかの制限/概念がありませんか?
これはcrontabです:
0,10,20,30,40,50 * * * * /usr/bin/php /var/www/html/loadChecker.php
そして、これはスクリプトloadChecker.php
です:
<?php
define('LOAD_TRIGGER',10); // threshold setting for when to mail the load
// get load average
if (function_exists("sys_getloadavg")){
$content=sys_getloadavg();
$load=$content[0];
$content = implode(" " , $content);
}
else{
$content = file_get_contents("/proc/loadavg");
$loadavg = explode(" ", $content);
$load = $loadavg[0] + 0;
}
if($load >= LOAD_TRIGGER) // check if load is too high
{
// load is too high. If we are in a browser, show running processes, otherwise mail them.
$ps = Array();
exec("ps auxO-C | head", $ps);
$ps = implode("\n", $ps);
$hs = Array();
exec("service httpd fullstatus", $hs);
$hs = implode("\n", $hs);
if (isset($_SERVER['REMOTE_ADDR'])) // are we in a browser?
{
// yes we are. Let's show the PS and HTTPD fullstatus
$output = str_replace("\n", "<br/>\n", str_replace(" ", " ", $ps . "\n\n\n\n" . $hs)); // make it browser friendly
$output = "<html><head></head><body>$output</body></html>";
echo "Load is $content<br/>\n<br/>\n$output";
}
else
{
// no, we're not. Let's mail the PS and HTTPD fullstatus
mail("me@here.com", "Load is $content", "$ps \n \n \n \n$hs "); // BUT THIS FAILS. THE PS IS SHOWN. BUT THE FULLSTATUS IS EMPTY IN THE MAIL
}
}
else
{
// load is OK. If we are in a browser, show running processes
if (isset($_SERVER['REMOTE_ADDR']))
{
$ps = Array();
exec("ps auxO-C | head", $ps);
$ps = implode("\n", $ps);
$hs = Array();
exec("service httpd fullstatus", $hs);
$hs = implode("\n", $hs);
$output = str_replace("\n", "<br/>\n", str_replace(" ", " ", $ps . "\n\n\n\n" . $hs)); // make it browser friendly
$output = "<html><head></head><body>$output</body></html>";
echo "Server load normaal ($content) op webserver3<br/>\n<br/>\n$output";
}
}
?>