<b>通過腳本案例學習</b><b>shell</b><b>(一)</b>
--- 如何通過複雜鎖腳本得知腳本正在運作或者被意外中斷<b></b>
<b></b>
鎖是一種機制,是程式與程式之間協同工作的一種機制。
運作腳本程式會遇到以下問題:
1、早上你打開電腦運作了一個時間比較長的腳本,突然被老闆叫了過去,等你回來你缺忘了是否運作過此腳本怎麼辦?
2、有一天你正在運作某一個腳本,伺服器突然當機,但是你又想知道腳本是否運作完成.
如何解決以上問題呢!
有一種方法是通過在腳本運作之前建立一個鎖檔案,通過判斷鎖檔案是否存在而判斷腳本是否在執行.
下面通過一個複雜鎖實作腳本的自動化運維過程.
如果思路如下:
運作腳本前,判斷鎖檔案是否存在,如果存在,說明此腳本可能正在運作也有可能是腳本被意外中斷,然後通過判斷運作的腳本PID和之前運作的PID是否一緻,如果一緻,說明腳本正在運作,如果不一緻說明腳本是被意外中斷,會重新運作此腳本。
#!/bin/bash
LOCKFILE=/tmp/$(basename $0)_lockfile //設定變量
if [ -f $LOCKFILE ];then //假如鎖檔案存在
MYPID=$(cat $LOCKFILE) //檢視鎖檔案中的PID值
ps -p $MYPID | grep $MYPID &>/dev/null //比較PID是否一緻
[ $? -eq 0 ] && echo "The script backup.sh is running" && exit 1 //PID一緻,則顯示運作資訊,并退出腳本
else
echo $$ > $LOCKFILE //如果鎖檔案不存在或者鎖檔案存在,PID不一樣,則将新的PID值寫入鎖檔案
fi
bash /etc/backup.sh //寫你要運作的腳本
rm -rf $LOCKFILE //成功之後删除鎖檔案
部分腳本分析
bash /etc/backup.sh ($0=/etc/backup.sh)
basename $0 顯示路徑後面的檔案名backup.sh
$? 判斷上一個語句執行是否有顯示正确結果,如果正确顯示為0,如果不正确顯示非0數字。
$$ 顯示父程序ID
通過read指令設定斷點進行簡單測試鎖檔案腳本是否OK
LOCKFILE=/tmp/$(basename $0)_lockfile
if [ -f $LOCKFILE ];then
MYPID=$(cat $LOCKFILE)
ps -p $MYPID | grep $MYPID &>/dev/null
[ $? -eq 0 ] && echo "The script backup.sh is running" && exit 1
echo $$ > $LOCKFILE
echo "The script is running!"
read
echo "The script is stop!"
rm -rf $LOCKFILE
測試1、腳本正常運作結束效果。
read是個斷點指令,腳本會一緻停留着那裡,直到按回車進入吓一跳指令
<a href="http://blog.51cto.com/attachment/201303/213238129.jpg" target="_blank"></a>
<a href="http://blog.51cto.com/attachment/201303/213225250.jpg" target="_blank"></a>
測試2、腳本正在運作測試效果
打開一個終端運作鎖腳本
<a href="http://blog.51cto.com/attachment/201303/213304365.jpg" target="_blank"></a>
打開另一個終端再次運作鎖腳本,由于腳本正在運作,是以在此打開的腳本不會被運作。
<a href="http://blog.51cto.com/attachment/201303/213316939.jpg" target="_blank"></a>
測試2、腳本意外中斷測試效果
通過Ctrl+c 模拟腳本中斷,由于兩次的PID不一緻,是以腳本會被重新運作。
<a href="http://blog.51cto.com/attachment/201303/213330713.jpg" target="_blank"></a>
本文轉自淩激冰51CTO部落格,原文連結:http://blog.51cto.com/dreamfire/1152067,如需轉載請自行聯系原作者