防止服务器进程突然死掉,如何制作重启进程脚本

前言:在运维工作中,往往在服务器上的进程会在意想不到的时候突然结束进程,
并且大多数都是同事反馈问题,才知道服务端进程悄无声息掉了,需要重启。

为了防止凌晨期间,服务器进程结束,引发一系列不必要的麻烦,我们可以做一个简单的小脚本,对程序进行每十秒左右的监控,查看是否正在正常运行,如果未正常运行,脚本自动重启对应的程序。

环境: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:写成三个脚本,是为了方便大家学习,其实是可以一个脚本就能处理的。