背景
在進行後臺開發的時候,由於項目本身由多位同事維護,而佈設的測試服務器僅一臺, 便經常出現腳本執行的多線程(多人) 問題。
比如我們有一個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].