2005年11月21日 星期一

DNS 自我監控

前陣子DNS出了點問題,後來和同事研究不如寫個 script 丟進 crontab 作監控,目前想到的方法是這樣,列幾個重要的 FQDN, 定時用 host/nslookup 去查詢看看查不查得到,於是寫了像是這樣的監控 script:







#!/bin/sh

#

# 測試特定的 FQDN 是否查詢得到,若有問題則自動重啟並 mail

#

DATE=`date "+%Y%m%d %H:%M"`

HOST=ns

SERVER=ns.domain.net

LOG=/var/log/ns_check.log

MAIL="admin@ns.domain.net"



# 全部要測試的 FQDN

FQDNLIST="ns.domain.net. www.hinet.net."



# 若測試任一 FQDN 有問題則設為 1,最後依此變數決定有沒有問題

CHECK=0





# 依序測試 DNLIST 裡的各個 FQDN

for DN in $FQDNLIST

do



host $DN | grep address

if [ $? -ne 0 ] ; then

CHECK=1

echo $DATE $HOST dns query fail: $DN >> /tmp/$HOST_ns_check.tmp

echo $DATE $HOST dns query fail: $DN >> $LOG

fi



done



# 若有任何一個 FQDN 測試有問題,則重啟 DNS 並 E-mail 通知

if [ $CHECK -eq 1 ] ; then

mail -s "[$HOST] $DATE dns query error" $MAIL < /tmp/$HOST_ns_check.tmp

rm /tmp/$HOST_ns_check.tmp

/sbin/service named stop

sleep 3

/sbin/service named start

fi











只是可能還是有些問題很難避免,像是如果有問題寄信 E-mail 位址也查詢不到那自然信也寄不出來(寫死 smtp server ip 在 /etc/hosts或是 script 直接用 ip 寄?);或是問題是自動重啟也無法解決時,那丟在 crontab 裡剛好就讓它一直不斷重啟=.= 難道要另外將一定時間內重啟次數寫入另一個檔案作 check 嗎?另外還有一些機器不知道為什麼有時用 service named restart 或 stop/start 會有問題沒辦法正常重啟,這也很麻煩,難道真的得寫個迴圈重複 stop 好幾次或是非得暴力動用 kill -9 不可嗎?@_@



不知道有沒有更好的方法?(應該還有動用高級 content switch 以外的方法吧?)