1. 程式人生 > >檢測環境中是否有core檔案並自動傳送郵件通知

檢測環境中是否有core檔案並自動傳送郵件通知

最近遇到幾次測試人員間隔好些天發現環境中出現了core檔案,因為時間太長導致版本和相關資訊缺失的情況,因此想到寫一個指令碼用於監控環境中core檔案的產生,併發及時傳送郵件告警。

指令碼如下:

#########################################################################
# File Name: check_core.sh
# Author: liuhj
# mail: [email protected] 
# Created Time: Tue 08 Aug 2017 11:10:34 AM CST
#########################################################################
#!/bin/bash
mail_config_file="/root/.muttrc"
mail_content="./mailcontent"
if [ ! -f "$mail_config_file" ]; then
	touch "$mai l_config_file"
	chmod 777 $mail_config_file
	echo "set envelope_from=yes">>$mail_config_file
	echo "set [email protected]">>$mail_config_file
	echo "set realname=\"checkcore\"">>$mail_config_file
	echo "set use_from=yes">>$mail_config_file
	echo "set rfc2047_parameters=yes">>$mail_config_file
	echo " set charset=\"utf-8\"">>$mail_config_file
else
	sed -i 's/se t from.*/set [email protected]/' $mail_config_file
	sed -i 's/.*realname.*/set realname="checkcore"/' $mail_config_file
fi

if [ -f "$mail_content" ]; then
	rm -f "$mail_content"
	#chmod 777 "$mail_content"
fi

DIR="/home/core/"

if [ ! -d "$DIR" ]; then
	echo " create core dir"
	mkdir -p "$DIR"
fi

core_num=`ls /root/ | grep ^core. | wc -l`
core_file=`ls /root/ | grep ^core.`
if [ "$core_num" -gt 0 ]; then
	#echo "core_nume:$core_num"
	#echo "core_file:$core_file"
	cd /root/
	tmp=`pwd`
	echo "pwd:$tmp"
	echo "core_file:$core_file DIR:$DIR"
	mv -f $core_file $DIR
	echo $?
	touch "$mail_content"
	chmod 777 "$mail_content"
	#date >> $mail_content
	echo "hi," >>$mail_content
	echo "you got core files on server">>$mail_content
	server_ip=`ifconfig|grep 'inet addr'|grep -v '127.0.0.1'|cut -d: -f2 |awk '{print $1}'`
	echo "server ip:$server_ip">>$mail_content
	#date >> $mail_content
	echo "core files had been moved to /home/core">>$mail_content
	#date >> $mail_content
	echo "file name:$core_file">>$mail_content
	cat mailcontent | mail -s "core file check" [email protected]
fi
用的linux自帶的mail命令來發送郵件,但是中間遇到很多問題,郵件無法傳送

core檔案檢查指令碼使用
環境準備
1.安裝sendmail
rpm -q sendmail檢查是否安裝sendmail
如果沒有安裝,執行yum install sendmail -y進行安裝
2.修改本地hostname為域名形式(防止傳送郵件被識別為垃圾郵件)
修改/etc/hosts檔案,將127.0.0.1對應的那條配置註釋掉,增加類似下面的配置
127.0.0.1 aa.com
統一/etc/sysconfig/network檔案中HOSTNAME配置
HOSTNAME=aa.com
執行hostname aa.com生效配置
3.將配置的域名寫入/etc/mail/local-host-names檔案
aa.com
4.修改/etc/mail/sendmail.cf
將 
O DaemonPortOptions=Port=smtp,Addr=127.0.0.1, Name=MTA
替換為
O DaemonPortOptions=Port=smtp,Addr=0.0.0.0, Name=MTA
5.重啟sendmail
service sendmail restart


指令碼使用
1.下載或上傳指令碼check_core.sh到本地環境(example: /home/)
2.如果指令碼許可權不夠,給指令碼增加執行許可權,chmod +x /home/check_core.sh
3.crontab定時執行指令碼
crontab -e編輯定時任務,增加如下命令(每五分鐘檢查一次)
*/5 * * * * /home/check_core.sh > /dev/null 2>&1
4.修改傳送目標,指令碼中找到cat mailcontent這行,修改郵箱地址
cat mailcontent | mail -s "core file check" [email protected]
5.增加抄送人員
步驟4中的命令後面增加 -c 抄送人員郵箱地址

注意事項:
1.sendmail鎖住導致無法使用
[root@DB-Server ~]# service sendmail status
sendmail dead but subsys locked
sm-client (pid  22112) is running...
原因是postfix衝突,將postfix關閉即可解決
2.sendmail的執行日誌記錄在/var/log/maillog中,可以通過這個日誌來確認執行的狀態
如果日誌停止記錄,可能是因為syslog導致
[root@localhost script]# ps -ef | grep syslog
root      1138     1  0 Aug07 ?        00:00:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
root     42202 24311  0 11:06 pts/3    00:00:00 grep syslog
解決:
kill -9 1138
/sbin/rsyslogd -i /var/run/syslogd.pid -c 5