使用参数将文件锁定到bash脚本中

时间:2019-03-04 15:36:25

标签: bash

我必须创建一个bash脚本,以检查是否正在执行其他相同的脚本。为此,我已经实现了此解决方案

scriptToVerify="sl_dynamic_procedure.sh_${1}";
LOCKFILE=${SL_ROOT_FOLDER}/work/$scriptToVerify
if [ -e ${LOCKFILE} ] && kill -0 `cat ${LOCKFILE}`; then
  sl_log "---------------------------Warning---------------------------"
  sl_log "$scriptToVerify already in execution"
  exit
fi
trap "rm -f ${LOCKFILE}; exit" INT TERM EXIT
echo $$ > ${LOCKFILE}

我添加了${1},因为我的脚本有一个参数。 如果我尝试执行不带参数的脚本(不带${1}),它将正常工作。如果我尝试执行不止一次,则带有参数的脚本有时有效,有时无效。如何修复我的代码?

1 个答案:

答案 0 :(得分:0)

首先,您是否要允许脚本即使在运行另一个副本的情况下也可以执行,只要它们具有不同的参数?不知道脚本的作用和参数是什么,我不知道这是否明智,但总的来说,这似乎是您在买麻烦。

第二,使用锁定文件是很常见的,但是要遵守竞争条件。使锁的创建和对其进行测试成为单个原子操作要好得多。对于文件来说,这几乎是不可能的,但是对于目录,这确实很容易。

myLock=/tmp/ThisIsMySingleLockDirectoryName
lockMe()   { mkdir $myLock 2>&-; }
unlockMe() { rmdir $myLock 2>&-; } 

if lockMe
then : do stuff
     unlockMe
else echo "Can't get a lock."
     exit 1
fi

这很简单,因为它丢弃了stderr,并且没有测试原因...但是您明白了。

要点是,如果目录创建已经存在,则返回错误。