Linux的文件锁flock
今天看腾讯云服务器的脚本时,发现在root用户的crontab定时任务里面有个函数flock。在每五分钟执行脚本时在脚本前面加上了“ flock -xn /tmp/stargate.lock -c ”。
crontab -l 查看后详细的写法如下:
*/5 * * * * flock -xn /tmp/stargate.lock -c '/usr/local/qcloud/stargate/admin/start.sh > /dev/null 2>&1 &'
使用man flock查看flock的man手册页。flock即file lock 。
当多个进程可能会对同样的数据执行操作时,这些进程需要保证其它进程没有也在操作,以免损坏数据。进程会使用一个「锁文件」,也就是建立一个文件来告诉别的进程自己在运行,如果检测到那个文件存在则认为有操作同样数据的进程在工作。所以shell命令flock通过加锁方式实现互斥访问,常用于多进程间互斥访问。
flock:manage locks from shell scripts。
-s, --shared:共享锁,或者称为读锁;
-u,--unlock:手动释放锁,一般情况不必须,当FD关闭时,系统会自动解锁;
-w, --wait, --timeout seconds:设置阻塞超时,当超过设置的秒数时,退出阻塞模式,返回1;
-x,-e,--exclusive:获取一个排它锁,或者称为写锁,为默认项;
-n,--nb, --nonblock:非阻塞模式,当获取锁失败时,返回1而不是等待;
-c, --command ,command:在shell中执行其后的语句。
那么上面的crontab运用flock防止start.sh脚本重复执行 。当下个任务启动时,flock命令检测到文件/tmp/stargate.lock写锁定,会返回1直接失败,不会执行。而原来正在运行的任务,执行完毕后,会自动删除/tmp/stargate.lock文件锁。
现在做个while.sh脚本来就行测试。
#!/usr/bin/bash
while true
do
echo `date`,"ok"
sleep 3s
done
1、flock -xn
在一个终端内使用flock运行此进程:
flock -xn /tmp/mywhile.lock -c '/usr/bin/bash /home/lighthouse/myshells/while.sh'
在再开一个终端运行,发现直接退出,退出状态码(exit status)是1 。
2、flock -x
在一个终端内使用flock运行此进程:
flock -x /tmp/mywhile.lock -c '/usr/bin/bash /home/lighthouse/myshells/while.sh'
在再开一个终端运行,两个同时运行,后一个发现处于等待状态,而不是退出状态。ctrl + c杀掉第一个进程,第二个就开始运行,可以从时间上看出先后。
3、flock -x -w
在一个终端内使用flock运行此进程:
flock -x -w 6 /tmp/mywhile.lock -c '/usr/bin/bash /home/lighthouse/myshells/while.sh'
在再开一个终端运行,两个同时运行,后一个发现处于等待状态,而不是退出状态,过了6秒之后发现退出,退出状态码(exit status)是1 。