1. 程式人生 > >一個守護vsftp程序的指令碼

一個守護vsftp程序的指令碼

最近一個朋友遇到了如下需求任務,是要求用shell實現一個常駐程式,讓我幫助他完成。需求如下:                   

  1、該程式每5秒鐘檢查vsftp程序執行狀態

  2、如果vsftp程序正在執行,檢查當前目錄下的vsftpd.pid檔案是否存在:如果不存在則自動建立檔案,並在檔案中           寫入程序號;如果pid檔案存在,則檢查當前程序號與pid檔案中的程序號是否一致,如果不一致,則自動更新pid        檔案為當前程序號;

  3、如果vsftp程序不存在,則:如果shell首次啟動執行,則主動拉起vsftp程序,並把程序號寫入到vsftpd.pid檔案               中;

  4、如果上一次檢查時程式正在執行,這次檢查程式已經不存在,說明程式在這段時間異常退出,則主動拉起vsftp進         程,更新vsftpd.pid檔案,同時寫出告警檔案,告警檔案的格式是 Warn_YYYY_MM_DD_SN.txt(YYYY 年 MM 月         份 DD 日期 SN 自增序列號)



程式碼如下:DaemonVsftp.sh

#!/bin/bash

IsFirstStart=0
ProcessName=vsftpd                         #vsftp服務的程序名
FileName=vstfpd.pid
SNFileName=SNFile.txt                      #記錄自增序列號SN,最開始為1,每次讀取作為SN,
                                           #然後將該值加1在寫入檔案,下次再讀取作為SN

#如果vsftp程序存在,要執行的任務
FuncExistProcess(){
	PID=$(pidof ${ProcessName})            #獲得vsftp程序ID
	if [ -e $FileName ];then
		OldPID=$(cat $FileName)
		if [ ! $PID -eq $OldPID ];then
			echo $PID > $FileName
		fi
	else
		touch $FileName
		echo $PID > $FileName
	fi
}

#如果vsftp程序不存在,要執行的任務
FuncNoProcess(){
	if [ $IsFirstStart -eq 0 ];then
		echo "start vsftp!"
		service vsftpd start             #啟動vsftp
		IsFirstStart=1
	else
		echo "start vsftp!"
		service vsftpd start
		SN=$(cat $SNFileName)
		NewSN=$[$SN+1]
		echo $NewSN > $SNFileName        #將加1後的SN寫入檔案
		
		WarnFileName="Warn_"$(date +%Y_%m_%d)"_"${SN}".txt" #拼接警告檔名
		touch $WarnFileName
	fi
}




if [ ! -e $SNFileName ];then               #第一次執行該指令碼時,建立SNFile.txt檔案,並將1寫入
	touch $SNFileName
	echo 1 > $SNFileName 
fi

while true                                #死迴圈,每5秒迴圈一次
do
	if [ $(pgrep $ProcessName|wc -l) -gt 0 ];then #判斷vstfp程序是否存在
		FuncExistProcess
	else
		FuncNoProcess
	fi
	sleep 5
done



由於筆者的水平有限,出錯在所難免,懇請讀者拍磚指正,謝謝閱讀。