Bash
根據參數鎖定bash腳本?
我試圖找到一種方法來根據給定的參數鎖定腳本,但未能找到正確的答案。
我想要實現的是阻止另一個使用者基於某個參數執行腳本:因此,如果使用者 A 使用參數
JOHN_DOE
(例如:)執行腳本-d JOHN_DOE
並且使用者 B 使用參數執行它,-d ANNA_DOE
那麼它執行沒有任何問題,但是如果使用者B 嘗試使用JOHN_DOE
as 參數執行它,而腳本的第一個實例尚未完成執行,然後它不允許使用者 B 執行它。有沒有合適的方法來實現這一目標?
諸如
flock
可以幫助管理鎖的工具。(它可能不適用於 NFS,具體取決於您是否相信文件或實踐,同樣可能適用於也可能不適用於 SMB 或任何其他遠端文件系統。)文件,
man flock
確實有幾個使用範例。這是根據您的場景量身定制的其中之一。#!/bin/bash # Example of using flock(1) to provide a named exclusive lock # Parse command line options while getopts 'd:' OPT do case "$OPT" in d) lockParam="$OPTARG" ;; *) echo "Usage: ${0##*/} -d <parameter>" >&2; exit 1 esac done shift $(($OPTIND -1)) # Sanitise lock parameter value (do not trust the user) lockName="$(printf "%s\n" "${lockParam^^}" | tr -cd '[:alnum:]\n')" lockFile="/tmp/lock.${##*/}.${lockName:-noname}" echo "Attempting lock with parameter '$lockParam' sanitised to '$lockName'" >&2 ( # Get the lock or report failure. See "man flock" for other options flock -n 9 || exit 9 # This section is managed by the exclusive lock. Your program code # would go here. echo "Achieved exclusive lock on '$lockFile'" >&2 sleep=10 echo "Waiting for $sleep second(s) to simulate activity" >&2 sleep $sleep # Exit status 0=ok, otherwise 1-8 is your choice of error codes echo "Releasing lock" >&2 exit 0 # End of exclusive lock section ) 9>"$lockFile" ss=$? # Report on exit status from actual code if [ $ss -eq 9 ] then echo "Failed to acquire lock" >&2 fi # Exit with meaning exit $ss
使腳本可執行(如果您呼叫它
lockeg
thenchmod a+x lockeg
),然後執行它./lockeg -d JOHN_DOE