用法
進(jìn)入程序目錄
啟動(dòng)服務(wù)
./daemon.sh start "command" interval
關(guān)閉服務(wù)
./daemon.sh stop
注意: 所有操作必須要在程序所在目錄完成
日志 daemon會(huì)在程序目錄產(chǎn)生4個(gè)文件
daemon.log —— 主程序日志
daemon.master.log —— 守護(hù)程序日志
daemon.pid —— 主程序PID文件
daemon.master.pid —— 守護(hù)程序PID文件
- 對(duì)源腳本修改 進(jìn)程的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