linux守护进程

发布时间:2016-01-14 15:17:01编辑:丝画阁阅读(287)

shell写的守护进程程序,后台检测,进程意外挂掉后可以马上自动重启,并邮件通知管理员。

脚本使用方法:
step1:脚本使用前需要先修改脚本中的路径(baseDir)和管理员邮箱。
step2:先运行要监护的进程,比如./process1 param

step3:启动进程监护程序,使用命令如下:./watchdog.sh process1 param


#!/bin/bash
now=$(date'+%Y-%m-%d %H:%M:%S')
 
# the time interval between watchdog.sh monitorings
sleepTime=5
 
# log of watchdog.sh monitorings
watchdogLog="./watchdoglog.txt"
 
# current path
curDir=$(pwd)
# echo "current path is: \"$curDir\""
 
# the path of the monitored process
#baseDir="/home/admin/release/server/"  # intranet
baseDir="/usr/local/src/ftp/release/server/"   # extranet
 
if[[ $# -ne 1 && $# -ne 2 ]]; then
    echo"$0 parameter number is error!"
    exit
fi
 
# process name of watchdog.sh monitorings
procName=$1
echo"procName is: \"$procName\""
 
# parameter of process
paramName=$2
echo"paramName is: \"$paramName\""
 
user=$(whoami)
# echo "user is \"$user\""
if[["$user"!="root"]];then
    echo"this tool must run as *root*"
    exit
fi
 
while[[ 0 -lt 1 ]]
do
    now=$(date'+%Y-%m-%d %H:%M:%S')
    if[["$paramName"==""]];then
        ret=$(psaux |grep"$procName$"|grep-v"grep"|grep-v"$0 $procName$"|wc-l)
    else
        ret=$(psaux |grep"$procName $paramName$"|grep-v"grep"|grep-v"$0 $procName $paramName$"|wc-l)
    fi
    # echo "$procName $paramName ret = $ret"
 
    if[[ $ret -lt 1 ]];then
        echo"$now process $procName $paramName is not exists...">>"$watchdogLog"
        # send email to notice administrator
        echo"$now process $procName $paramName is not exists..."| mail -s"server status change notice"youremail@qq.com
        cd"$baseDir"
        # echo "./$procName $paramName"
        if[["$paramName"==""]];then
            nohup./"$procName">/dev/null2>&1 &
        else
            nohup./"$procName""$paramName">/dev/null2>&1 &
        fi
        cd"$curDir"
        echo"$now restart process(pid=$!) $procName $paramName done...">>"$watchdogLog"
    fi
    sleep$sleepTime

done




第二个shell脚本

#! /bin/sh
#进程名字可修改
PRO_NAME=udhcpc
WLAN=ra0
  
whiletrue;do
  
#    用ps获取$PRO_NAME进程数量
  NUM=`psaux |grep${PRO_NAME} |grep-vgrep|wc-l`
#  echo $NUM
#    少于1,重启进程
  if["${NUM}"-lt"1"];then
    echo"${PRO_NAME} was killed"
    ${PRO_NAME} -i ${WLAN}
#    大于1,杀掉所有进程,重启
  elif["${NUM}"-gt"1"];then
    echo"more than 1 ${PRO_NAME},killall ${PRO_NAME}"
    killall -9 $PRO_NAME
    ${PRO_NAME} -i ${WLAN}
  fi
#    kill僵尸进程
  NUM_STAT=`psaux |grep${PRO_NAME} |grepT |grep-vgrep|wc-l`
  
  if["${NUM_STAT}"-gt"0"];then
    killall -9 ${PRO_NAME}
    ${PRO_NAME} -i ${WLAN}
  fi
done
  
exit0



关键字