shell指令碼實現檔案鎖功能_linux shell

來源:互聯網
上載者:User

1.背景

當多個進程可能會對同樣的資料執行操作時,這些進程需要保證其它進程沒有在操作,以免損壞資料。通常,這樣的進程會使用一個“鎖檔案”,也就是建立一個檔案來告訴別的進程自己在運行,如果檢測到那個檔案存在則認為有操作同樣資料的進程在工作。這樣的問題是,進程不小心意外死亡了,沒有清理掉那個鎖檔案,那麼只能由使用者手動來清理了。

2.關於flock

flock 是對於整個檔案的建議性鎖。也就是說,如果一個進程在一個檔案(inode)上放了鎖,那麼其它進程是可以知道的。(建議性鎖不強求進程遵守。)最棒的一點是,它的第一個參數是檔案描述符,在此檔案描述符關閉時,鎖會自動釋放。而當進程終止時,所有的檔案描述符均會被關閉。

3. shell中實現flock系統調用的命令是flock,其使用格式有以下兩種(man flock)


複製代碼 代碼如下:

flock [-sxon] [-w timeout] lockfile [-c] command...
flock [-sxun] [-w timeout] fd


選項和參數:


-s,--shared:擷取一個共用鎖定,在定向為某檔案的FD上設定共用鎖定而未釋放鎖的時間內,其他進程試圖在定向為此檔案的FD上設定獨佔鎖的請求失敗,而其他進程試圖在定向為此檔案的FD上設定共用鎖定的請求會成功。
-x,-e,--exclusive:擷取一個排它鎖,或者稱為寫入鎖,為預設項
-u,--unlock:手動釋放鎖,一般情況不必須,當FD關閉時,系統會自動解鎖,此參數用於指令碼命令一部分需要非同步執行,一部分可以同步執行的情況。
-n,--nb, --nonblock:非阻塞模式,當擷取鎖失敗時,返回1而不是等待
-w, --wait, --timeout seconds:設定阻塞逾時,當超過設定的秒數時,退出阻塞模式,返回1,並繼續執行後面的語句
-o, --close:表示當執行command前關閉設定鎖的FD,以使command的子進程不保持鎖。
-c, --command command:在shell中執行其後的語句

4. shell中實現排它鎖避免指令碼重複執行

Linux中的例行性工作排程crontab會定時執行一些指令碼,但指令碼的執行時間往往無法控制,當指令碼執行時間過長時,可能會導致上一次任務的指令碼還沒執行完,下一次任務的指令碼又開始執行了。這種情況下可能會出現一些並發問題,嚴重時會導致出現髒資料/效能瓶頸的惡性迴圈。
通過使用flock建立排它鎖可以規避這個問題,如果一個進程對某個加了獨佔鎖定,則其它進程無法加鎖,可以選擇等待逾時或馬上返回。測試執行個體如下:

4.1 建立執行指令碼

複製代碼 代碼如下:

#cat /scripts/shell/file_lock.sh
#!/bin/bash
# Description: test for file flock
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

echo ""
echo "----------------------------------"

echo "start at `date '+%Y-%m-%d %H:%M:%S'` ..."

sleep 140s

echo "finished at `date '+%Y-%m-%d %H:%M:%S'` ..."


4.2 建立定時任務:測試排它鎖


複製代碼 代碼如下:

#crontab -e
* * * * * flock -xn /dev/shm/test.lock -c "sh /scripts/shell/file_lock.sh > /root/stdout.log"

每分鐘執行一次該指令碼,並將輸出資訊寫入到stdout.log
 
查看輸出日誌如下:
複製代碼 代碼如下:

----------------------------------
start at 2014-04-10 10:23:01 ...            #擷取鎖
finish at 2014-04-10 10:25:21 ...           #釋放鎖
 
 
----------------------------------
start at 2014-04-10 10:26:01 ...            #10:27:00及10:28:00啟動的定時任務由於無法擷取鎖,以失敗而退出執行,直到10:26:00才擷取到鎖
finish at 2014-04-10 10:28:21 ...


4.3 測試排它鎖,加上等待逾時


複製代碼 代碼如下:

* * * * * flock -x -w 20 /dev/shm/test.lock -c "sh /scripts/shell/file_lock.sh > /root/stdout.log"

查看日誌輸出資訊:
複製代碼 代碼如下:

----------------------------------
start at 2014-04-10 10:29:01 ...
finish at 2014-04-10 10:31:21 ...
 
----------------------------------
start at 2014-04-10 10:31:21 ...    #10:31:00啟動的定時任務等待了20秒後,上一個任務釋放了鎖,所以此任務可以馬上拿到鎖,並繼續執行
finish at 2014-04-10 10:33:41 ...

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.