使用的是QQ邮箱,需要先在邮箱中开通smtp服务

QQ邮箱开通stmp

目录结构

根目录 /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增加延迟。