在網上的伺服器監測程式有很多, 功能都十分完善, 但如果你像我一樣只要監測伺服器是否 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 時, 就會發電郵通知定義了的管理員電郵.