Linux.命令Linux技术分享

Linux的文件锁flock

2021-06-15  本文已影响0人  刘小白DOER

    今天看腾讯云服务器的脚本时,发现在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 。

上一篇下一篇

猜你喜欢

热点阅读