You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:12:01