LINUX flock 控制非同步執行
阿新 • • 發佈:2019-02-20
利用flock
來管理工作狀態
我過去在自修作業系統的時候,有學到mutex這個東西,而flock
就是可以在shell上使用的mutex。
flock
的官方說明
NAME flock - Manage locks from shell scripts SYNOPSIS flock [-sxon] [-w timeout] lockfile [-c] command... flock [-sxon] [-w timeout] lockdir [-c] command... flock [-sxun] [-w timeout]fd DESCRIPTION This utility manages flock(2) locks from within shell scripts or the command line. The first and second forms wraps the lock around the executing a command, in a manner similar to su(1) or newgrp(1). It locks a specified file or directory, whichis created (assuming appropriate permissions), if it does not already exist. The third form is convenient inside shell scripts, and is usually used the following manner: ( flock -s 200 # ... commands executed under lock ... ) 200>/var/lock/mylockfile The mode used to openthe file doesn’t matter to flock; using > or >> allows the lockfile to be created if it does not already exist, however, write permission is required; using < requires that the file already exists but only read permission is required. By default, if the lock cannot be immediately acquired, flock waits until the lock is available. OPTIONS -s, --shared Obtain a shared lock, sometimes called a read lock. -x, -e, --exclusive Obtain an exclusive lock, sometimes called a write lock. This is the default. -u, --unlock Drop a lock. This is usually not required, since a lock is automatically dropped when the file is closed. However, it may be required in special cases, for example if the enclosed command group may have forked a background process which should not be holding the lock. -n, --nb, --nonblock Fail (with an exit code of 1) rather than wait if the lock cannot be immediately acquired. -w, --wait, --timeout seconds Fail (with an exit code of 1) if the lock cannot be acquired within seconds seconds. Decimal fractional values are allowed. -o, --close Close the file descriptor on which the lock is held before executing command. This is useful if command spawns a child process which should not be hold ing the lock. -c, --command command Pass a single command to the shell with -c. -h, --help Print a help message. AUTHOR Written by H. Peter Anvin <[email protected]>. COPYRIGHT Copyright © 2003-2006 H. Peter Anvin. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. SEE ALSO flock(2) AVAILABILITY The flock command is part of the util-linux-ng package and is available from ftp://ftp.kernel.org/pub/linux/utils/util-linux-ng/.
重點說明
透過flock
,程式會先嚐試取得某個lock(通常代表某個檔案)的擁有權之後才執行,執行的時候會握有該lock的擁有權,並且在結束之後才釋出擁有權。
舉例來說,如果我們寫一個shell script放在$HOME
底下:
#! /bin/bash sleep 10 date
儲存成test.sh
並且開啟執行許可權(chmod
700 test.sh
)
此時如果我們開啟兩個shell, 並且約同時執行:
flock /tmp/demo.lock ~/test.sh
這時會發生什麼事情呢?
使用者應該會看到兩個shell都停住,一個等10秒後印出時間,一個再過10秒後印出時間:
flock
的引數
除了預設的行為之外,我們可以透過引數來調整flock
的行為。和預設行為上最主要的差異在於,當無法獲得lock_path
的擁有權時,接下來的動作會不同。
-
flock -n lock_path xxx
:當無法獲得擁有權的時候,直接中止程式,不執行xxx。 -
flock -s lock_path xxx
:把lock_path
當成一個shared lock,同時能被多個程式擁有。所以大家都可以馬上執行,而且同時擁有lock_path
-
flock -x lock_path xxx
:把lock_path
當成一個exclusive lock,同時只能被一個程式擁有。
注:一個lock_path
不能同時為shared和exclusive!