監測主機狀態的 Bash 小程式,Linux / Mac OSX 適用

Mowd 在 LowEndTalk 討論區上面看到有人分享了一段監測主機狀態的 Bash 程式
可以同時監測多台主機,並且發信提醒管理者主機出狀況了
Mowd 覺得不錯,於是抓下來想要在 Mac OSX Server Lion 上跑跑看
可是卻有點問題,Mac OSX Server 的 mailx 指令不接受參數 -r 指定發信人 E-mail
而且加到 Mac 的工作排程 launchd 也會有其他的問題
於是 Mowd 修改了一下後,分享給大家
修改過後的程式可以適用於 Mac OSX Server 以及 Linux


程式邏輯如下:

1. 透過 ping google 主機 8.8.4.4 來確定這台主機可以 ping
2. 連續 ping 5 次主機(COUNT=5),如果有 2 次失敗(TIMEOUT=2)就記錄起來
3. 當主機被標記為掛掉超過 2 次(MAXFAIL=2),就發信到指定信箱(MAILTO)

語法如下,將灰色區塊的內容存下來後加上執行權限就可以直接執行
Bash script here: http://pastebin.com/qwXcU160

#!/bin/bash
#
# add ip or hostname space separated
HOSTLIST=”example.com 8.8.8.8″

# email report
MAILTO=”YOU@gmail.com”
MAILFROM=”YOU@example.com”
USER_HOME=”/Users/YOU/”

# number of ping requests, timeout in seconds and a threshold
COUNT=5
TIMEOUT=2
MAXFAIL=2

# ip to use to check if *this* machine can ping (8.8.4.4 is google dns)
CONTROLIP=”8.8.4.4″

#
let “THRESHOLD = $COUNT – $MAXFAIL”

ping -c 1 -W $TIMEOUT $CONTROLIP > /dev/null && for HOST in $HOSTLIST
do
count=$(ping -c $COUNT -W $TIMEOUT $HOST | grep ‘received’ | awk -F’,’ ‘{ print $2 }’ | awk ‘{ print $1 }’)
if [ $count -lt $THRESHOLD ] ; then
# too many ping failed but control is up: if previously up->failed-once, if failed-once->down

if [ -f $USER_HOME.up-$HOST ]; then
mv $USER_HOME.up-$HOST $USER_HOME.failed-once-$HOST
else
if [ -f $USER_HOME.failed-once-$HOST ]; then
mv $USER_HOME.failed-once-$HOST $USER_HOME.down-$HOST
echo “Host : $HOST is down (ping failed) at $(date)” | mailx -s “Alert: $HOST is down” $MAILTO
else
# is it down or a new host -> failed-once
if [ ! -f $USER_HOME.down-$HOST ]; then
touch $USER_HOME.failed-once-$HOST
fi
fi
fi

else
# most ping ok, host is up: if !up -> up

if [ ! -f $USER_HOME.up-$HOST ]; then
if [ -f $USER_HOME.failed-once-$HOST ]; then
rm $USER_HOME.failed-once-$HOST
else
if [ -f $USER_HOME.down-$HOST ]; then
rm $USER_HOME.down-$HOST
echo “Host : $HOST is up again (ping ok) at $(date)” | mailx -s “Alert: $HOST is UP again” $MAILTO
fi
fi
touch $USER_HOME.up-$HOST
fi

fi
done

發表迴響

你的電子郵件位址並不會被公開。