Linux 文件锁
1、背景
Linux 系统定时任务正在执行时,可能会遇到上个周期的任务还没有执行完,这样便会造成相同的任务同一时间有过个任务进程在执行。如果任务有对互斥资源操作时,有可能产生死锁。
2、用法参考
flock 命令,是 linux 的文件锁命令。可以通过一个锁文件,来控制多个任务进程的互斥性。用法如下:
$ flock -h Usage: flock [options] <file|directory> <command> [command args] flock [options] <file|directory> -c <command> flock [options] <file descriptor number> Options: -s --shared 获得共享锁 -x --exclusive 获得排他锁(默认) -u --unlock 移除锁 -n --nonblock 失败而不等待 -w --timeout <secs> 等待一段时间 -E --conflict-exit-code <number> 冲突或超时后的退出代码 -o --close 在运行命令前关闭文件描述符 -c --command <command> 通过 shell 运行一条命令 -h, --help 显示此帮助并退出 -V, --version 输出版本信息并退出
3、操作步骤
3.1 任务互斥
*/5 * * * * flock -xn /tmp/receive-ossutil-1.lock -c /root/rabbitmq-comsumer.sh */5 * * * * flock -xn /tmp/receive-ossutil-2.lock -c /root/rabbitmq-comsumer.sh */5 * * * * flock -xn /tmp/receive-ossutil-3.lock -c /root/rabbitmq-comsumer.sh
x 表示文件锁为互斥文件锁,这个参数可以省略,默认即为互斥文件锁。
n 表示当有任务执行时,直接退出,符合我们的逾期。
3.2 排队等待
*/10 * * * * flock -w 20 /tmp/my.lock -c /root/rabbitmq-comsumer.sh
排队执行,每个任务等待 20s,超时则退出。
3.3 共享锁
# 共享锁 */10 * * * * flock -s /tmp/my.lock -c /root/rabbitmq-comsumer.sh
3.4 忽略锁
*/10 * * * * flock -u /tmp/my.lock -c /root/rabbitmq-comsumer.sh
忽略锁,直接执行。
3.5 自定义退出码
*/10 * * * * flock -E 1 -w 20 /tmp/my.lock -c /root/rabbitmq-comsumer.sh
4、注意事项
在自定义退出码时,尽量使用 1 位的数字,当使用多位数字时,会出现不是自定义的其他返回码。
5、结果检查
创建相关定时计划任务后,观察是否符合预期。