- shell脚本如下
#!/bin/bash
threadname="$1"
date=`date +%Y-%m-%d/%H:%M:%S`
echo ${date}
if [ -z "${threadname}" ]; then
echo "必须提供进程名称"
exit
fi
echo "开始检查进程${threadname}是否存活"
for line in $(ps -ef |grep ${threadname} |grep -v grep|grep -v daemon)
do
name[${i}]=$line
let i=${i}+1
done
listsize=${#name[@]}
ip=$(ifconfig -a|grep -A 1 eth0|grep inet|awk '{print $2}')
echo "${listsize}"
if [ 1 -gt ${listsize} ]; then
echo "发送告警"
curl --location --request POST '告警地址' \
--header 'Content-Type: application/json' \
--data '{
"msgtype":"text",
"text":{
"content":"'"${threadname}"'进程已挂,即将自动重启,请确认服务是否正常'"${ip}"'"
}
}'
if [ -z "$2" ]; then
echo "未提供重启脚本,守护进程终止"
exit
fi
$("$2")
else
echo "进程活着不告警"
fi
- 调用方式假设脚本放到了
/opt/ylbzj/
,脚本执行需要两个参数,第一个是进程名称必须
,第二个重启脚本非必须
sh /opt/ylbzj/daemon.sh nginx /usr/local/nginx/sbin/nginx
- crontab任务配置,一分钟执行一次 ,定时脚本执行加上sudo便面一些权限问题
*/1 * * * * sudo sh /opt/ylbzj/daemon.sh nginx /usr/local/nginx/sbin/nginx >>/opt/ylbzj/daemon.log
- 如果重启的脚本稍微复杂,可以用一个脚本中转一下,创建一个脚本
#!/bin/bash
##写需要执行的脚本
sh /opt/ylbzj/start_service_waring.sh start
设置为可执行的文件
chmod +x /opt/ylbzj/daemon_start.sh
执行脚本则为
sh /opt/ylbzj/daemon.sh demo.jar /opt/ylbzj/daemon_start.sh