對於守護進程管理、自動重啓、記錄log,有一個很好用的進程管理工具 supervisord 。它可以說簡單易用,且功能強大。但是對於我的部署需求來說還是過於繁瑣,且沒有搞定用它如何記錄進程狀態。
今天寫了一個簡單的shell腳本,以滿足我的所有需求,並且部署簡單。
希望能夠給有同樣需求的碼農們提供一個參考。
pgmctl.sh
#!/bin/bash
#run: /pathto/pgmctl.sh [start &|stop|restart &]
#author: color_wind
# shell dir name
PAT=`dirname $0`
# set parameters
CMD="$PAT/pgmctl"
LOG="$PAT/logs/pgmctl.log"
PID="$PAT/logs/.pgmctl.PID"
CFG="$PAT/conf/px.cfg"
#set ulimit
ULM="102400"
# ---------------------------------------------------
# edit these function as your needs
function start {
ulimit -n $ULM
$CMD -f $CFG >> $LOG 2>&1 &
tpid=$!
echo $tpid > $PID
echo "start [ok]"
}
function stop {
kill `cat $PID`
rm $PID
echo "stop [ok]"
}
# --------------------------------------------------
echo "$CMD $1"
case "$1" in
start)
start
;;
restart)
if [ -f $PID ] ; then
stop
sleep 3
fi
start
;;
stop)
stop
exit 0
;;
esac
TMP_LOG_DAY=`date '+%y%m%d'`
for (( c=0 ; ; c++ ))
do
TMP_LOG_NOW=`date '+%y%m%d' -d '+5 second'`
if (($TMP_LOG_DAY != $TMP_LOG_NOW)); then
cp -f $LOG $LOG".1"
echo " " > $LOG
gzip -c $LOG".1" > $LOG"."$TMP_LOG_DAY".gz" &
TMP_LOG_DAY=$TMP_LOG_NOW
fi
if [ -f $PID ] ; then
tpid=`cat $PID`
cmdex="ps uh -p$tpid"
psrtn=`$cmdex`
if [ -z "$psrtn" ]; then
echo "`date '+%y%m%d%H%M%S'` FATALERROR RESTART SERVICE" >> $LOG
start
elif (( $c%20 == 0 )); then
echo "`date '+%y%m%d%H%M%S'` PSINFO: $psrtn" >> $LOG
c=0
fi
sleep 3
else
break
fi
done
重啓:./pgmctl.sh restart &
停止:./pgmctl.sh stop
另外,此腳本只是示例,提供一個思路。到你正在用的時候,需要按照自己需求修改