最常用可靠的方式是用 flock 命令给 cron 任务加排他锁,由内核保障原子性、进程退出自动释放、不残留,一行即可接入 crontab。

最常用也最可靠的方式,是用 flock 命令给 cron 任务加排他锁。它由内核保障原子性,进程退出自动释放锁,不残留、不依赖外部服务,一行就能接入 crontab。
直接在 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 是锁文件路径,建议用绝对路径,不存在时会自动创建。
在脚本内部加锁(适合需精细控制的场景)
把锁逻辑写进脚本开头,全程保护主流程:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 用
exec 200>/tmp/myjob.lock分配一个文件描述符并关联锁文件 - 用
flock -xn 200尝试对 fd 200 加非阻塞独占锁 - 用
trap 'flock -u 200' EXIT确保脚本无论正常退出还是被 kill,都会自动解锁
这样即使脚本中途出错或被信号中断,锁也不会卡住。
验证锁是否生效
运行中可执行:fuser -v /tmp/backup.lock
能看到当前持有该锁的进程 PID;
若无输出,说明锁未被占用,或锁文件路径不对。
替代方案:纯 shell 目录锁(无 flock 时可用)
利用 mkdir 的原子性创建临时目录作为锁:
- 尝试
mkdir /tmp/myjob.lock,成功则获得锁,并用trap 'rmdir /tmp/myjob.lock' EXIT注册清理 - 失败则说明已有实例在运行,直接退出
优点是不依赖额外命令;缺点是锁路径必须唯一且可写,且不能跨文件系统使用。

















