2020-07-16 daemon后台进程脚本

用法

进入程序目录

启动服务

./daemon.sh start "command" interval

关闭服务

./daemon.sh stop

注意: 所有操作必须要在程序所在目录完成

日志 daemon会在程序目录产生4个文件

daemon.log —— 主程序日志

daemon.master.log —— 守护程序日志

daemon.pid —— 主程序PID文件

daemon.master.pid —— 守护程序PID文件

  • 对源脚本修改 进程的stderr stdout 重定向到daemon.log
#!/bin/bash

# constant

LOGFILE="daemon.log"
LOGMASTERFILE="daemon.master.log"
PIDFILE="daemon.pid"
PIDMASTERFILE="daemon.master.pid"

# variables

ACTION=$1
COMMAND=$2
INTERVAL=${3:-1}
PID=''
RETRY=3
STAT=1


# function

monitor() {
  while true 
  do
    PSLINE=$(ps $PID | wc -l)
    if [ -n "$PID" -a $PSLINE -eq 1 ]; then
      start_process
      echo restart
    fi
    echo $PSLINE
    sleep $INTERVAL 
  done;
}

stop() {
  if [ -e $PIDMASTERFILE ] ; then
    kill $(cat $PIDMASTERFILE)
    rm $PIDMASTERFILE 
    echo "master has stop"
  fi

  if [ -e $PIDFILE ] ; then
    kill $(cat $PIDFILE)
    rm $PIDFILE 
    echo "child has stop"
  fi
}

start_process() {
  if [ -z "$COMMAND" ] ; then
    echo "Usage: $0 start <command>" >&2
    exit 1
  fi
  $COMMAND > $LOGFILE 2>&1 &
  PID=$!

  sleep 1 
  PSLINE=$(ps $PID | wc -l)
  if [ $PSLINE -eq 1 ]; then
    RETRY=$(($RETRY - 1))
    STAT=0
  else
    RETRY=3
    STAT=1
    echo $PID > $PIDFILE
  fi

  if [ $RETRY -lt 1 ]; then
    echo some error occured
    exit 1
  fi
}

start_monitor() {
  (monitor &> $LOGMASTERFILE& [ $STAT -eq 1 ] && echo $! > $PIDMASTERFILE)
}

# main

case $ACTION in
  start)
    start_process
    start_monitor
    echo "Write log in deamon.log"
    ;;
  stop)
    stop
    ;;
  *)
    echo "Usage: $0 {start <command>|stop}" >&2
    exit 1
    ;;
esac
  
exit 0
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。