用法
进入程序目录
启动服务
./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