这两天做了一个服务监控报警重启的脚本。本质就是用一个shell命令去监控服务状态,如果宕机就会自动重启,并向指定邮箱发送邮件对管理人员进行提醒,再使用crontab命令设置每隔一分钟运行一次这个shell脚本,实现对服务的监控。
本来很简单,以为半天就能实现,结果问题出在了发送邮件上,硬生生的搞了两天,才在部门其他大神的帮助下搞定,所以在此总结下。
首先先写一个简单的监控服务的shell脚本,公司在服务器上跑的是以jar包的形式,为了方便测试,我就随便找了一个jar包,命名为1.jar
直接新建编辑一个moni.sh 脚本文件
vi moni.sh
在moni.sh中进行编辑
run=$(ps -ef |grep "1.jar" |grep -v "grep")
if [ "$run" ] ; then
echo "The service is alive!"
else
echo "系统宕机" | mail -s "警告" 2364******@qq.com #接收人邮箱地址
echo "The service was shutdown!"
echo "Starting service ..."
nohup java -jar 1.jar &
echo "The service was started!"
fi
再对crontab命令进行设置
crontab -e
直接会进入编辑页面,输入以下代码设置间隔时间自动运行
*/1****bash /home/wangzh/moni.sh #设置为每间隔1分钟执行一次脚本
@reboot nohup java -jar 1.jar & #每当系统重启时都会自动运行服务
linux发送邮件很简单,它自带有发送邮件的mail,一开始我使用mail进行发送邮件发现不成功;就想通过linux的sendmail来发送,这个需要使用yum下载sendmail的rpm包,且配置十分麻烦,最后由于种种原因放弃了,回归linux自带的mail发送邮件方式。
mail.rc进行编辑
vim /etc/mail.rc
进入编辑页面后,在其中添加以下配置信息
set from=xxxx@126.com #对方收到邮件后显示的发送人
set smtp=smtp.126.com#你发送邮件的邮箱服务器地址
set smtp-auth-user=xx@126.com#发件人的邮箱
set smtp-auth-password=xxx#开启你邮箱中运行第三方发送的授权码,填写授权码
set smtp-auth=login
保存退出后,输入以下发送邮件命令进行测试
(我的个人经验,主题不要用英文,内容不限但不能写test,容易被当成垃圾邮件直接被第三方邮件服务器拦截)
echo "邮件内容" | mail -s "邮件主题" 2364600***@qq.com #邮箱为接收人邮箱,邮箱服务器地址跟你发件人邮箱有关,接收人邮箱并无限制
到此基本功能都实现了。但问题出在了发送邮件上面。发送邮件屡次不成功,一开始执行命令后,不弹出错误信息,也收不到邮箱,后来开始报 timed out,也报过一些诸如535这样的错误代码,中间排除了许多可能,最后把错误定位到端口号上。
使用TSL加密协议,也就是465端口。
既然使用的是SSL协议,那当然是要有证书的了,下面是获取证书的命令:
先创建一个证书的存放目录(.cert加了一个.是隐藏目录的意思,具体需不需要隐藏,我也不知道,网上教程使用的隐藏)
mkdir -p /home/wangzh/.certs/ //放到绝对路径下
再以此输入以下命令:
echo -n | openssl s_client -connect smtp.163.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 -L -d /home/wangzh/.certs
命令执行完毕后,如果不报错,就会看到以下文件:
然后有了证书文件,我们还需要在etc/mail.rc中编辑代码获取证书文件
vim /etc/mail.rc
在mail.rc中添加以下代码:
set ssl-verify=ignore
set nss-config-dir=/home/wangzh/.certs #这个路径是你自己的certs存放的路径
保存退出。一切ok!