# #! 不是注釋符,而是指定腳本由哪個解釋器來執(zhí)行,
# #! 后面有一個空格,空格后面為解釋器的全路徑且必須正確。
#! /bin/ash
PRO_PATH=""
# testpro 為要守護(hù)的可執(zhí)行程序,即保證它是一直運(yùn)行的
PROGRAM="testpro"
# 此腳本一直不停的循環(huán)運(yùn)行,while <條件> 與 do 放在一行上要在條件后加分號
# if、then、while、do等關(guān)鍵字或命令是作為一個新表達(dá)式的開頭,
# 一個新表達(dá)式之前的表達(dá)式必須以換行符或分號(;)來結(jié)束
# 如果條件不是單個常量或變量而是表達(dá)式的話,則要用[]括起來
# while、until與for循環(huán)皆以do開始以done結(jié)束構(gòu)成循環(huán)體
while true ; do
# 休息10秒以確保要看護(hù)的程序運(yùn)行起來了,這個時間因?qū)嶋H情況而定
sleep 10
# 單引號''中的$符與\符沒有了引用變量和轉(zhuǎn)義的作用,但在雙引號""中是可以的!
# 單引號中如果還有單引號,則輸出時全部的單引號都將去掉,單引號括住的內(nèi)容原樣輸出。
# 例:echo 'have 'test'' --> have test
# ps aux --> a 為顯示其他用戶啟動的進(jìn)程;
# u 為顯示啟動進(jìn)程的用戶名與時間;
# x 為顯示系統(tǒng)屬于自己的進(jìn)程;
# ps aux | grep 可執(zhí)行程序名 --> 在得到的當(dāng)前啟動的所有進(jìn)程信息文本中,
# 過濾出包含有指定文本(即可執(zhí)行程序名字)的信息文本行
# 注:假設(shè) ps aux | grep 可執(zhí)行程序名 有輸出結(jié)果,但輸出不是一條信而是兩條,
# 一個為查找到的包含有指定文本(即可執(zhí)行程序名字)的信息文本行(以換行符0x10結(jié)尾的文本為一行),
# 一個為 grep 可執(zhí)行程序名 ,即把自己也輸出來了,
# 所這條信息是我們不需要的,因?yàn)槲覀冎幌胫付值目蓤?zhí)行程序是否啟動了
# grep -v 指定文本 --> 輸出不包含指定文本的那一行文本信息
# wc -l --> 輸出文件中的行數(shù)(-l --> 輸出換行符統(tǒng)計(jì)數(shù))
# ps aux | grep $PROGRAM | grep -v grep | wc -l --> 如果有指定程序名的程序啟動的話,結(jié)果大于壹
PRO_NOW=`ps aux | grep $PROGRAM | grep -v grep | wc -l`
# 整數(shù)比較:-lt -> 小于,-le -> 小于等于,-gt -> 大于,-ge -> 大于等于,-eq ->等于,-ne -> 不等于
# if [條件] 與 then 放在一行上要在條件后加分號
# 如果當(dāng)前指定程序啟動的個數(shù)小于壹的話
if [$PRO_NOW -lt 1]; then
# 0 -> 標(biāo)準(zhǔn)輸入,1 -> 標(biāo)準(zhǔn)輸出,2 - > 標(biāo)準(zhǔn)錯誤信息輸出
# /dev/null --> Linux的特殊文件,它就像無底洞,所有重定向到它的信息數(shù)據(jù)都會消失!
# 2 > /dev/null --> 重定向 stderr 到 /dev/null,1 >& 2 --> 重定向 stdout 到 stderr,
# 直接啟動指定程序,且不顯示任何輸出
# 可執(zhí)行程序后面加空格加&,表示要執(zhí)行的程序?yàn)楹笈_運(yùn)行
./$PROGRAM 2>/dev/null 1>&2 &
# date >> ./tinfo.log --> 定向輸出當(dāng)前日期時間到文件,添加到文件尾端,如果沒有文件,則創(chuàng)建這個文件
date >> ./tinfo.log
# echo "test start" >> ./tinfo.log --> 定向輸出 test start 添加到文件尾端
echo "test start" >> ./tinfo.log
# if 分支結(jié)構(gòu)體結(jié)束
fi
# 基本與上面的相同,就是多了一個 grep T,其結(jié)果為過濾出含 T 字符的信息行
# T --> 進(jìn)程已停止,D --> 不可中斷的深度睡眠,R --> 進(jìn)程運(yùn)行或就緒,S --> 可接收信號的睡眠,
# X --> 已完全死掉,Z --> 已完全終止
PRO_STAT=`ps aux|grep $PROGRAM |grep T|grep -v grep|wc -l`
# 如果指定進(jìn)程狀態(tài)為已停止的信息大于零的話
if [ $PRO_STAT -gt 0 ] ; then
# killall --> 用名字方式來殺死進(jìn)程,-9 --> 即發(fā)給程序一個信號值為9的信號,即SIGKILL(非法硬件指令)
# 也可以不指定信號,默認(rèn)為SIGTERM,即信號值為15
killall -9 $PROGRAM
sleep 2
./$PROGRAM 2>/dev/null 1>&2 &
date >> ./tinfo.log
echo "test start" >> ./tinfo.log
fi
# while、until與for循環(huán)皆以do開始以done結(jié)束構(gòu)成循環(huán)體
done
# exit 用來結(jié)束腳本并返回狀態(tài)值,0 - 為成功,非零值為錯誤碼,取值范圍為0 ~ 255。
exit 0
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報。