Bash脚本运行时锁定目录且脚本终止自动解锁的实现问题
错误原因
flock 仅支持对文件或已打开的文件描述符加锁,你直接传入目录路径执行命令,就会触发bad file descriptor报错。
实现方案
flock 锁本身是和进程绑定的,无论进程正常退出、异常崩溃还是设备断电,系统都会自动释放进程持有的所有flock锁,完全满足你不需要手动清理、重启后无残留锁的需求。我们通过一个独立的锁文件来实现目录使用的互斥控制。
注意事项
你现有代码中的rm "$dir_path"缺少递归删除参数,无法删除目录,需要调整为rm -rf "$dir_path"才能正常执行删除逻辑。
完整可运行代码
# 需提前定义好dir_path和template_dir变量 lock_file="${dir_path}.lock" # 创建锁文件并绑定到文件描述符9 touch "$lock_file" exec 9> "$lock_file" # 尝试加非阻塞排他锁,拿不到锁直接退出(说明已有脚本实例在操作目录) flock --exclusive --nonblock 9 || exit 0 # 原有逻辑:删除目标目录,屏蔽所有输出 rm -rf "$dir_path" > /dev/null 2>&1 # 删除后目录仍存在,说明有其他进程占用,直接退出 if [ -d "$dir_path" ]; then exit 0 fi # 复制模板目录到目标路径 cp -r "$template_dir" "$dir_path" # 后续你的其他业务逻辑 # ...
方案说明
- 锁和脚本进程绑定,脚本运行期间一直持有锁,任何原因导致进程终止,系统都会自动关闭文件描述符、释放锁,无需手动执行任何清理操作
- 设备断电后系统重启,所有进程销毁,锁自动失效,不会出现下次启动目录仍被锁定的问题
- 非阻塞拿锁的逻辑和你原有判断目录是否被占用的逻辑完全匹配,无需调整原有业务流程
内容的提问来源于stack exchange,提问作者user5507535
相关产品推荐
相关产品推荐

