最直接可靠的方式是用 flock 命令加文件锁,它由内核保障原子性,进程退出自动释放,无需手动清理,也不依赖外部服务;推荐在 crontab 中用 flock 包裹原命令,或在脚本中通过 exec 分配 fd 并配合 trap 自动解锁。

最直接可靠的方式是用 flock 命令加文件锁,它由内核保障原子性,进程退出自动释放,无需手动清理,也不依赖外部服务。
flock 一行接入 crontab(推荐)
修改原定时任务,在命令外包裹 flock,例如:
- 原来:* */2 * * * /usr/bin/python3 /opt/backup.py
- 改成:* */2 * * * /usr/bin/flock -xn /tmp/backup.lock -c "/usr/bin/python3 /opt/backup.py"
其中:
-x 表示独占锁,-n 表示拿不到锁立刻失败不等待,/tmp/backup.lock 是锁文件路径(建议用绝对路径)
脚本执行完或被 kill,锁自动消失,不会残留
在脚本内部加锁(适合需精细控制的场景)
把 flock 放在脚本开头,锁定整个执行流程:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
#!/bin/bash
exec 200>/tmp/myjob.lock
flock -xn 200 || { echo "Another instance is running"; exit 1; }
trap 'flock -u 200' EXIT
<h1>这里写你的主逻辑,比如 rsync、curl、数据库操作等</h1><p>关键点:
• exec 200>... 分配一个文件描述符并关联锁文件
• flock -xn 200 尝试对 fd 200 加非阻塞独占锁
• trap 确保脚本退出时自动解锁(即使被 kill 也生效)
替代方案:目录锁(无 flock 时可用)
利用 mkdir 的原子性创建临时目录作为锁:
LOCKDIR="/tmp/myjob.lock" if mkdir "$LOCKDIR" 2>/dev/null; then trap 'rmdir "$LOCKDIR"' EXIT # 主任务 else echo "Already running" exit 1 fi
优点是纯 shell 实现,不依赖额外命令;缺点是锁粒度略粗,且需确保 LOCKDIR 路径唯一、可写
哪些情况要避开
• 不要用 touch + 检查 PID 文件:进程崩溃后 PID 文件残留,导致假锁
• 不要手写 while sleep 循环等待:浪费资源,且无法处理异常中断
• 不要省略 -n 参数:否则可能无限阻塞,影响 cron 下一周期调度
• 锁文件不要放在 /tmp 下被自动清理的子目录中(如 systemd-tmpfiles 清理策略可能误删)

















