start.sh(启动服务)
此脚本用于直接启动服务,但是如果程序崩溃或者异常等导致挂掉后并不能自动重启
#!/bin/bash
SERVICE_LIB_PATH="./lib"
SERVICE_PATH="/root/testserver"
SERVICE_NAME="testserver"
START_CMD="./$SERVICE_NAME"
LOG_FILE="run.log"
cd $SERVICE_PATH
pwd
export LD_LIBRARY_PATH=$SERVICE_LIB_PATH:$LD_LIBRARY_PATH
# 后台运行服务 且输出重定向到LOG_FILE中
nohup ${START_CMD} > ${LOG_FILE} 2>&1 &
# 获取子进程的PID
server_pid=$!
echo `date +%Y-%m-%d` `date +%H:%M:%S` "$SERVICE_NAME(PID:${server_pid}) start"
watch.sh(启动服务并持续监控服务是否在运行)
此脚本除了可启动服务外,还定时监控目标服务是否在运行,如果未运行会自动启动目标服务
此脚本运行前,会先运行stop.sh,防止重复启动程序
注意:此脚本运行时需要用nohup在后台运行(或者其他方法),如果直接./watch.sh &则关闭终端后监控就失效了,不能自动启动目标服务了,所以下面还有个runwatch.sh脚本
#!/bin/bash
#启动watch进程 监控server是否在运行,如果未运行则自动启动程序
#建议用runwatch后台启动本监控脚本
SERVICE_NAME="testserver"
sh ./stop.sh
# 获取当前脚本的PID
current_pid=$$
# 保存当前脚本的PID 用于stop.sh中杀死此监控脚本进程
echo $current_pid > testwatch.pid
while true
do
procnum=`ps -ef|grep $SERVICE_NAME|grep -v grep|wc -l`
if [ $procnum -eq 0 ]
then
# 当目标服务进程未运行时 运行run.sh启动服务
echo `date +%Y-%m-%d` `date +%H:%M:%S` "watch.sh(PID:$current_pid) start service : $SERVICE_NAME"
sh ./run.sh
fi
sleep 2
done
runwatch.sh(后台运行watch.sh脚本)
用来后台运行watch.sh脚本
#!/bin/bash
#后台运行监控脚本
LOG_FILE="runwatch.log"
nohup ./watch.sh > ${LOG_FILE} 2>&1 &
stop.sh(停止服务运行)
停止服务运行,主要有两步,先杀死watch脚本进程,再杀死服务进程
杀死服务进程我时用的pkill,如果想用kill可以自行替换
#!/bin/bash
# 本文件用于杀死watch进程和server进程
SERVICE_NAME="testserver"
# watch进程的pid缓存文件
PIDFILE="./testwatch.pid"
##############################杀死watch进程########################################
# 从文件中读取PID
PID=$(cat $PIDFILE)
# 检查PID是否存在
if kill -0 "$PID" 2>/dev/null; then
# PID存在,杀死进程
kill -9 $PID
# 检查进程是否被杀死
if ps -p $PID > /dev/null
then
echo "watch进程$PID未能被杀死。"
else
echo "watch进程$PID已被杀死。"
fi
else
echo "watch进程PID $PID 不存在或无法杀死。"
fi
rm -f $PIDFILE
##############################杀死server进程########################################
pkill -9 $SERVICE_NAME
procnum=`ps -ef|grep $SERVICE_NAME|grep -v grep|wc -l`
if [ $procnum -eq 0 ]
then
echo "server进程 $SERVICE_NAME 已被杀死。"
else
echo "server进程 $SERVICE_NAME 未能被杀死。"
fi