Bash

根據參數鎖定bash腳本?

  • October 25, 2022

我試圖找到一種方法來根據給定的參數鎖定腳本,但未能找到正確的答案。

我想要實現的是阻止另一個使用者基於某個參數執行腳本:因此,如果使用者 A 使用參數JOHN_DOE(例如:)執行腳本-d JOHN_DOE並且使用者 B 使用參數執行它,-d ANNA_DOE那麼它執行沒有任何問題,但是如果使用者B 嘗試使用JOHN_DOEas 參數執行它,而腳本的第一個實例尚未完成執行,然後它不允許使用者 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

使腳本可執行(如果您呼叫它lockegthen chmod a+x lockeg),然後執行它

./lockeg -d JOHN_DOE

引用自:https://unix.stackexchange.com/questions/722323