bash - 使用 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
因此,第一部分尝试锁定目录并在目录已存在时退出。
那里有第二段代码,因此如果脚本崩溃或退出,它会清理目录,以便脚本可以重新启动。
我的问题是,如果脚本已经在运行并且我开始第二个副本,它将由于锁定文件而退出,但在此过程中会删除锁定目录吗?
有没有一种方法可以确保如果脚本由于锁定文件的存在而终止,它不会删除它,但是如果脚本在执行过程中顺利退出和/或崩溃,它会清理目录?
我不想使用任何其他工具,我只是好奇如何实现这一点,而且我似乎找不到两者一起使用的任何示例。
解决方案
为什么需要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 退出,而不会删除您的锁定文件。
推荐阅读
- php - Laravel HTMLPurifier 过滤 base64 编码图像
- express - 添加猫鼬模式模型来表达导致错误500
- .net - 样式资源取决于字符串变量
- php - 使用 SQLite 在 laravel 中的身份验证问题
- r - 列数未知的 Expand.grid
- javascript - TypeError undefined 不是函数
- javascript - 递归创建所有可能的数字组合?
- python - 在一行上查找一个字符串并返回找到的字符串正下方的字符串 - Python 或 UNIX
- android - 如何符号化 AddressSanitizer 堆栈跟踪?
- python - Selenium 与 Python:如何在具有已知类的元素中选择标签