在网上的服务器监测程式有很多, 功能都十分完善, 但如果你像我一样只要监测服务器是否 down 机, 而且全都是 httpd 服务器, 可以透过 PHP 简单实现, 例如这样就可以很简单地看到服务器是否可以连接:
|
1 2 3 4 5 6 7 |
<?php if ($content = file_get_contents("192.168.1.10")) { echo "Server Status: Online!"; } else { echo "Server Status: Down!"; } ?> |
当然上面的程式很阳春, 只会印出服务器是否可以连接, 而且只可以人手打开上面 PHP 网页才可以监测。其实只要透过 crontab 自动执行 PHP, 就可以让 PHP 自动监测服务器, 并在发生问题时以电邮通知管理员。另外也可以在要监测的服务器上放一个细小的 PHP 程式, 会印出系统的 load average, 当发觉 load average 超过指定数值时同样发电邮通知管理员。
以下两个 PHP, 分别放到要监测的服务器以及执行监测的服务器上, 先将以下 server-status.php 放到要监测的服务器上, 让外部可以存取:
server-status.php
|
1 2 3 4 |
<?php $load = sys_getloadavg(); echo $load[0]; ?> |
然后将以下 server-monitor.php 放到执行监测的服务器, 不放在 web 目录都可以, 因为只是透过 crontab 执行:
server-monitor.php
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#!/usr/bin/php <?php ### 监测的主机, 可以是 ip 或 hostname $hosts = array( "192.168.1.10", "192.168.1.11" ); $admin_email = "admin@email.com"; ### 管理员的电邮 $load_avg = 2; ### 当 load average 达到这个数值, 通知管理员 ### function for check server status function server_check($addr) { if (($content = file_get_contents("http://" . $addr . "/server-status.php")) !== False) { if ($content > $GLOBALS["load_avg"]) { mail($GLOBALS["admin_email"], "Server $addr Busy", "Server $addr Busy\nloading average: $content"); } } else { mail($GLOBALS["admin_email"], "Server $addr Down", "Server $addr Down"); } } foreach ($hosts as $value) { server_check($value); } ?> |
将上面 server-monitor.php 设定成可执行及放到 crontab :
chmod +x server-monitor.php
crontab -e
crontab -e
开启 crontab 后, 加入这行:
*/5 * * * * /path/to/server-monitor.php > /dev/null 2>&1
储存后便完成了, 上面这行是每 5 分钟自动执行 /path/to/server-monitor.php, 当要监测的服务器无法连接, 或 load average 到达 2 时, 就会发电邮通知定义了的管理员电邮.