我必须创建一个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}
),它将正常工作。如果我尝试执行不止一次,则带有参数的脚本有时有效,有时无效。如何修复我的代码?
答案 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,并且没有测试原因...但是您明白了。
要点是,如果目录创建已经存在,则返回错误。