防止服务器进程突然死掉,如何制作重启进程脚本
前言:在运维工作中,往往在服务器上的进程会在意想不到的时候突然结束进程,
并且大多数都是同事反馈问题,才知道服务端进程悄无声息掉了,需要重启。
为了防止凌晨期间,服务器进程结束,引发一系列不必要的麻烦,我们可以做一个简单的小脚本,对程序进行每十秒左右的监控,查看是否正在正常运行,如果未正常运行,脚本自动重启对应的程序。
环境:centos6 +loginsvr进程
1.创建3个shell脚本文件,并赋于777权限
1. touch restart.sh #用于检测服务端进程是否正常
2. touch loginsvr.sh #用于重启相关进程
3. touch nohup.sh #用于后台执行restart.sh
4. chmod -R 777 restart.sh loginsvr.sh nohup.sh
2.脚本restart.sh,每十秒对loginsvr进行扫描一次并且输出日志
1. vim restart.sh
#!/bin/sh
while true
do
ps -ef|grep "loginsvr" | grep -v "grep"
if [ "$?" -eq 1 ]
then
./loginsvr.sh
echo "process has been restarted!"
else
echo "process is running normally!"
fi
sleep 10
done
3.脚本loginsvr.sh用于重启程序,并且输出日志,方便后续排查进程结束原因
1. vim loginsvr.sh
#! /bin/bash
#log path is /var/log/openstack-kilo
#if commod execute sucessed,it will return 0 else return 1
# Copyright 2014 Intel Corporation, All Rights Reserved.
#执行结果信息
function log_info ()
{
if [ -d /var/log ]
then
mkdir -p /var/log/shell_log
fi
DATE_N=`date "+%Y-%m-%d %H:%M:%S"`
USER_N=`whoami`
echo "${DATE_N} ${USER_N} execute $0 [INFO] $@" >>/var/log/shell_log/loginsvr.log #执行成功日志打印路径
}
function log_error ()
{
DATE_N=`date "+%Y-%m-%d %H:%M:%S"`
USER_N=`whoami`
echo -e "\033[41;37m ${DATE_N} ${USER_N} execute $0 [ERROR] $@ \033[0m" >>/var/log/shell_log/loginsvr.log #执行失败日志打印路径
}
#执行输出结果
function fn_log () {
if [ $? -eq 0 ]
then
log_info "$@ sucessed."
echo -e "\033[32m $@ sucessed. \033[0m"
else
log_error "$@ failed."
echo -e "\033[41;37m $@ failed. \033[0m"
exit 1
fi
}
#执行时,中断日志
trap 'fn_log "DO NOT SEND CTR + C WHEN EXECUTE SCRIPT !!!! "' 2
#启动对应的程序
kill $(pidof loginsvr)
ps -ef|grep -v grep|grep loginsvr|while read u p o
do
kill -9 $p
done
str_loginsvr1="/bin/loginsvr 6222 127.0.0.1 6220 -d" #程序启动路径
$str_loginsvr1
fn_log "$str_loginsvr1"
4.单独启动restart.sh脚本不能让其在后台运行,需要配合nohup使用(主要我还是个小白)
1.vim nohup.sh
nohup /root/restart.sh >test.log 2>&1&
5.调试是否正常重启,只需启动nohup.sh脚本即可
1. /root/nohup.sh #程序路径
2. kill $(pidof loginsvr) #干掉loginsvr进行
3. ps -ef|grep loginsvr #查看是否启动成功
4. cat /var/log/shell_log/loginsvr.log #查看自动重启日志
此方式治标不治本,如果出现二三次进程自动结束,需要耐心去排查进程结束的原因,毕竟使用脚本强制重启对应的进程,只是为了让程序出现问题能马上正常工作。
ps:写成三个脚本,是为了方便大家学习,其实是可以一个脚本就能处理的。