适用场景
当编写脚本处理任务并放置在计划任务中,不确定能不能在一个间隔时间内,处理完相关相关任务,且新的计划启动时会产生冲突,此时需要确保同时只有一个进程任务在运行。
处理方式多种多样,可以在脚本里面去判断,也可以通过flock来解决。
flock说明
flock即文件锁,是建议性锁,需要各进程主动去获取与释放。
flock适合进程间通信,不适合用作线程间互斥。
主要应用在解决文件读写冲突上。
文件锁种类
- shared lock 共享锁:如果是读取,不需要等待,但如果是写入,需要等待读取完成。
- exclusive lock 独占/排他锁:无论写入/读取都需要等待。
当文件被上了共享锁之后,其他进程可以继续为此文件加共享锁,但此文件不能被加排他锁,此文件会有一个共享锁计数,加上一个共享锁计数+1,解锁后-1,只有当共享锁计数为0时,才有可能被上排他锁。
当文件被上了排锁之后,在解锁前,不能上共享锁和排他锁。
命令格式
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: 如果没有立即获得锁,等待指定时间
-o, --close: 在运行命令前关闭文件的描述符号;
用于如果命令产生子进程时会不受锁的管控
-c, --command: 在shell中运行一个单独的命令
-h, --help 显示帮助
-V, --version: 显示版本
例子
# 当/tmp/test.lock被进程占用时,别的进程就不会再重复执行文件。不需要手动释放锁,禁止执行完之后会自动释放对lock文件的占用
*/5 * * * * flock -xn /tmp/test.lock -c 'bash /home/chaic/test.sh'