使用bash清理锁定目录。

时间:2018-06-20 18:22:06

标签: bash locking

经过一些重新设置后,我遇到了这些代码段,这些代码段用于脚本的简单锁定,而我只想运行一次。

    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

因此,第一部分尝试锁定目录,如果目录已经存在,则退出。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

为什么需要使用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退出,而不会删除您的锁定文件。