一、需求说明
作为一名主机运维工程师,日常工作中我们每天都需要巡检服务器的运行情况,包括服务器的网络通断性、磁盘利用率、服务进程等内容。为了减少工作量我们可以通过编写shell脚本,实现服务器的批量巡检。写好脚本之后我们可以设置定时任务,将巡检结果邮件发送给自己就OK啦。为了检查服务进程是否存在,我们常用命令ps -ef |grep 关键字 过滤查看我们的进程是否存在。此脚本就是基于此命令的基础上实现的。
二、脚本设计及内容
1、设计思路说明
- 通过ssh免密,使用ssh直接远程执行命令;Linux之SSH免密登录配置
- 使用pgrep -f 关键字命令查看进程是否存在;
- 使用$?判断进程号是否为空;
- 将结果存储到检查日志记录文件;
- 如果有进程不存在则邮件告知不存在信息,每天早上7点、晚上9点明确通知检查结果;Linux之mailx软件安装及使用
- 清理超过30天的巡检记录。
2、待巡检进程列表说明
将待巡检进程信息写入processes.txt文件中,文件中包括4列信息,主机名,ssh端口号,进程服务关键字,进程服务描述说明。processes.txt各列的分隔符是空格,所以关键字中不能包含空格哦。
3、脚本内容
#!/bin/bash
#script name: process_check.sh
#author: wuhs
#description: 此脚本用于系统进程服务巡检
#参数定义
#巡检日志存储路径
resultlog='/root/scripts/xunjian/process/recordlog'
#待巡检进程列表
processes="/root/scripts/xunjian/process/processes.txt"
#进程巡检方法
function process_monitor(){
datedir=`date +%F-%H`
mkdir -p $resultlog/$datedir
#while循环按行读取进程列表
while read line
do
#获取主机名、ssh端口号、service服务关键字
host=`echo $line | awk '{print $1}'`
port=`echo $line | awk '{print $2}'`
service=`echo $line | awk '{print $3}'`
#获取service服务的描述说明
des=`echo $line | awk '{print $4}'`
#查看进程是否存在
ssh $host -p $port -n pgrep -f $service &>/dev/null
#检查结果写入日志文件
if [ $? -eq 0 ];then
echo "$host $des 正常" >> $resultlog/$datedir/success.log
else
echo -e "$host $des 未启动" >> $resultlog/$datedir/faild.log
fi
done <"$processes"
#邮件通知检查结果
if [ -s $resultlog/$datedir/faild.log ]; then
mailx -s "进程巡检有进程不存在,请检查" 1234567qq@qq.com < $resultlog/$datedir/faild.log
else
hour=`date +%H`
if [[ $hour == 07 || $hour == 21 ]]; then
mailx -s "进程巡检正常!" wuhsh@bigdatayh.com,524627027@qq.com < $resultlog/$datedir/success.log
fi
fi
}
#清理超过30天的进程巡检日志记录
function log_clear(){
cd $resultlog
find -type d -mtime +30 |xargs rm -rf
}
function main(){
#系统服务检查
process_monitor
log_clear
}
main
三、使用示例
1、手动执行
#mkdir -p /root/scripts/xunjian/process
#创建工作目录,将脚本内容写入process_check.sh后保存,记得修改接受告警邮件的邮箱。
#chmod u+x process_check.sh
#脚本添加执行权限,将待巡检进程列表按照格式存入processes.txt文件中
#sh process_check.sh
#执行脚本,可以通过查看巡检日志文件获取巡检结果,也可以通过配置正确的邮箱,接受巡检结果。
2、配置定时任务
我们可以配置定时任务,设置每小时或者每10分钟执行一次进程巡检,如下示例为每天的早上6点到晚上10点,每个小时执行一次。
[root@s146 process]# crontab -l
####进程巡检定时任务####
1 6-22 * * * /root/scripts/xunjian/process/process_check.sh &>> /tmp/s146-monitor.log
配置完成定位任务后,我们就喝着茶,坐等巡检结果就好了。收到告警后及时处理。