Linux 簡單shell創建自己的守護進程,自動重啓,紀錄進程運行狀態,日誌切割壓縮

對於守護進程管理、自動重啓、記錄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  start  &

重啓:./pgmctl.sh restart &

停止:./pgmctl.sh stop


另外,此腳本只是示例,提供一個思路。到你正在用的時候,需要按照自己需求修改

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章