使用的是QQ邮箱,需要先在邮箱中开通smtp服务
目录结构
根目录 /var/haofangproject/email
├── alive.sh 监控脚本
├── emailStatus.txt 服务运行状态
├── isRun.txt 服务故障转变正常运行发送内容
├── noRun.txt 服务正常运行转变故障发送内容
├── mail.log 监控脚本输出日志
安装邮箱依赖
yum install sendmail
yum install mailx –y
yum update libreport-plugin-mailx
yum -y install sharutils
yum install mutt
编辑mail.rc
vim /etc/mail.rc
set from=xx@qq.com #发件邮箱,这里我使用了qq邮箱
set smtp=smtps://smtp.qq.com:465 #smtp服务器和端口地址
set smtp-auth-user=xx@qq.com #发件邮箱,这里我使用了qq邮箱
set smtp-auth-password=xxx #qq,163填写授权码,其他邮箱服务可以查一下是怎样解决的,应该是类似的。否则发送邮件时会报错误,qq会报这个错误smtp-server: 535
set smtp-auth=login #默认login即可,默认,不用修改
set ssl-verify=ignore #ssl认证方式,默认,不用修改
set nss-config-dir=/root/.certs #证书所在目录,这个可以改成其他的,但是不能空着,一会会根据这个目录生成证书
申请邮箱cert
mkdir -p /root/.certs/
echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt
certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt
certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ~/.certs/./ -i qq.crt
certutil -L -d /root/.certs
邮箱发送测试
mail -s "title" xx@qq.com < /usr/mail.txt
编写监控shell脚本
其中emailStatus.txt
是防止重复状态邮件的发送,用作是否发送邮箱的标志。noRun.txt
isRun.txt
是运行状态对应的邮件内容。
编写脚本alive.sh
#!/bin/bash
doc=`docker ps |grep 'haofang-service-app'`;
statu=`cat '/var/haofangproject/email/emailStatus.txt'`;
date=$(date "+%Y-%m-%d %H:%M:%S");
if [ -z "$doc" ]; then
echo ${date} 'no run';
if [ $statu = "1" ]; then
mail -s "title" 1061917196@qq.com < /var/haofangproject/email/noRun.txt
echo "0" > /var/haofangproject/email/emailStatus.txt
echo "${date} 已发送故障邮件"
fi
else
echo ${date} 'is run';
if [ $statu = "0" ]; then
mail -s "title" 1061917196@qq.com < /var/haofangproject/email/isRun.txt
echo "1" > /var/haofangproject/email/emailStatus.txt
echo "${date} 已发送恢复邮件"
fi
fi
配置定时任务
crontab -e
* * * * * sleep 30; sh /var/haofangproject/email/alive.sh
crontab -l
systemctl restart crond.service
crontab任务配置基本格式:
* * * * * command
- 第1列表示分钟0~59 每分钟用*或者 */1表示
- 第2列表示小时0~23(0表示0点)
- 第3列表示日期1~31
- 第4列表示月份1~12
- 第5列标识号星期0~6(0,7都可表示星期天)
- 第6列要运行的命令
综合起来就是: 分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-6,0代表星期天) 命令
从上面可以看出,crontab最小的时间单位: 1分钟。如果要每30秒执行一次脚本,要么写个小脚本,要么在crontab增加延迟。
网友评论