flock - Manage locks from shell scripts

Ubuntu: 20.04

在一些特殊的情境下,你可能會需要從 shell 上去執行有順序性的 script。但也因為有順序,所以容易發生上一個狀態尚未做完,下一個狀態的 script 就開始工作的狀況。

這時候 Unix 提供的 flock 就派上用場了,flock 的概念有點類似於 Mutual exclusion

flock 會先嘗試取得某個 lock file 的所有權之後才開始執行,執行時便會握有該 lock file 的所有權,並且在結束之後才釋出。因此,其他以 flock 執行並參考同一份的 lock file 的工作皆會等待原本的程式執行完成,並輪流取得所有權。

Basic Usage

flock 的使用方式為:

flock [options] file|directory command [arguments]

附上幾個較常用到的 options

Option Description
-e, -x, --exclusive 預設值,一次只能有一支程序能獲得所有權。
-n, --nb, --nonblock 如果不能獲得所有權,不會等待,直接結束程式。
-s, --shared 可以共用所有權,多支程式能一起執行。

Example

先建立一個範例測試檔案,執行以後會在 10 秒後顯示時間。

test.sh

#! /bin/bash
sleep 10
date

Notice: 記得要打開 test.sh 的執行權限。

接著可以開兩個視窗分別以 flock 去執行 test.sh

flock /tmp/demo.lock ./test.sh

從得到的結果很明顯可以看出,A window 執行時,B window 是在等待狀態,等 A 結束之後 B 才開始執行。

Result

A window:Tue 01 Jun 2021 04:23:20 PM
B window:Tue 01 Jun 2021 04:23:30 PM
Categories: Unix