天天看點

通過腳本案例學習shell(一)如何通過複雜鎖腳本解決腳本正在運作或者被意外中斷問題

 <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 &amp;&gt;/dev/null //比較PID是否一緻

        [ $? -eq 0 ] &amp;&amp; echo "The script backup.sh is running" &amp;&amp; exit 1  //PID一緻,則顯示運作資訊,并退出腳本

else 

        echo $$ &gt; $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 &amp;&gt;/dev/null 

        [ $? -eq 0 ] &amp;&amp; echo "The script backup.sh is running" &amp;&amp; exit 1 

        echo $$ &gt; $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,如需轉載請自行聯系原作者