首页 > 解决方案 > 使用 bash 清理锁定目录。

问题描述

经过一些研究后,我遇到了这些代码片段,用于对我只想运行一次的脚本进行简单锁定。

    if ! mkdir /tmp/myscript.lock 2>/dev/null; then
    echo "Myscript is already running." >&2
    exit 1
fi

function finish {
  rm -r /tmp/myscript.lock
}
trap finish EXIT

因此,第一部分尝试锁定目录并在目录已存在时退出。

那里有第二段代码,因此如果脚本崩溃或退出,它会清理目录,以便脚本可以重新启动。

我的问题是,如果脚本已经在运行并且我开始第二个副本,它将由于锁定文件而退出,但在此过程中会删除锁定目录吗?

有没有一种方法可以确保如果脚本由于锁定文件的存在而终止,它不会删除它,但是如果脚本在执行过程中顺利退出和/或崩溃,它会清理目录?

我不想使用任何其他工具,我只是好奇如何实现这一点,而且我似乎找不到两者一起使用的任何示例。

标签: bashlocking

解决方案


为什么需要trap用于清理。只需确保在退出点进行清理,如下所示:

tmpFile='/tmp/myscript.lock'

if ! mkdir "$tmpFile" 2>/dev/null; then
    echo "Myscript is already running." >&2
    exit 1
fi

echo "script is running..."
# script code starts here, sleep is just an example
sleep 20

# script complete, perform cleanup
rm -rf "$tmpFile"
echo "script completed..."

现在,当此脚本正在运行时,此脚本的所有后续调用将在第一个if块中以 status=1 退出,而不会删除您的锁定文件。


推荐阅读