flock shell script 使用速記

背景

在進行後臺開發的時候,由於項目本身由多位同事維護,而佈設的測試服務器僅一臺, 便經常出現腳本執行的多線程(多人) 問題。
比如我們有一個rebuild腳本, 負責重新編譯整個項目, 有的時候同時我更新了代碼,便登陸測試服務器更新編譯,殊不知另一個同事也在編譯, 於是兩個人都編譯不好了, 而且如果不在意的話, 根本不知道是怎麼回事。

爲了解決這個問題, 我讓這個rebuild腳本在執行編譯前先嚐試鎖住一個文件,然後再編譯,這樣當我試圖在別的同事編譯的時候編譯的話就會失敗,我自己也會被告知原因,也不影響其他同事。

腳本


#!/bin/bash

touch tmp_lock_file
{

         flock -n 11
         if [ "$?" -eq "1" ]; then
                   echo "There are others using this script"; 
                   exit;
         fi

    # build project below
    # ...
} 11<"tmp_lockfile"
`

flock 命令

一下爲對 man linux的翻譯 。

名字

flock - 在 shell 腳本中管理文件鎖

語法

#鎖特定文件或者文件夾, 如果權限合適的話,在lockfile不存在的時候會創建之。
flock [-sxon] [-w timeout] lockfile [-c] command... 
flock [-sxon] [-w timeout] lockdir [-c] command... 
#鎖特定文件描述符。
flock [-sxun] [-w timeout] fd 

描述

這個命令提供通過shell腳本或者其他命令行執行 flock 鎖 函數的功能。

使用文件描述符的常用格式 :

(
 flock -s 200

# ... commands executed under lock ...

) 200>/var/lock/mylockfile # 使用 > 的好處是文件不存在的時候會主動創建。

默認設置是flock阻塞直至獲取鎖。 當然我們可以通過 -n 參數使之立刻返回。

選項

-s, –shared

獲得一個共享鎖, 可以認爲是一個讀鎖。

-x, -e, –exclusive

獲得一個獨佔鎖, 也就是寫鎖, 默認是這種類型。
-u, –unlock

丟棄一個鎖。通常,由於鎖會在文件描述符釋放的時候自動丟棄,所以不需要這個選項。 某些特殊情況可能需要這個,比如enclosed命令組會創建一個後天進程但是這個進程並不持有鎖。

-n, –nb, –nonblock

非阻塞( 失敗的話不是等待而是立刻返回1)。

-w, –wait, –timeout seconds

超時等待,如果不能在規定的秒數內獲得鎖的話,就返回 1 .參數應該是整數。

-o, –close

在執行名列前關閉這個鎖鎖住的文件描述符。如果這個命令要產生一個不持有這個鎖的子進程的話這個參數就好使了。

-c, –command command

執行一個命令

-h, –help

打印

作者

Written by H. Peter Anvin [email protected].

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章