一個守護vsftp程序的指令碼
阿新 • • 發佈:2018-11-10
最近一個朋友遇到了如下需求任務,是要求用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
由於筆者的水平有限,出錯在所難免,懇請讀者拍磚指正,謝謝閱讀。