zoukankan      html  css  js  c++  java
  • flock文件锁的学习和应用

    flock文件锁 学习与应用    

    2016-9-20   

    作用:

      可以使用flock文件锁,避免指定命令的同时执行。(实现任务锁定,解决冲突)

    用法:  

      # flock -xn /opt/lock_file -c 'echo "123"'  加了flock限制后,检查到文件已被锁定,则继续等待或直接返回失败。

    说明:

     1. 锁文件不存在,会自动创建。  

     2. 命令进程执行完毕后,锁会自动释放。  

    参数解释:  

    -s, --shared:    获得一个共享锁  (命令可以同时执行)  
    -x, --exclusive: 获得一个独占锁  (锁被释放才会开始执行命令) 
    -u, --unlock:    移除一个锁(通常用不到,脚本执行完会自动释放锁)  
    -n, --nonblock:  如果没有立即获得锁,直接返回1失败,不等待. (非阻塞模式)  
    -w, --timeout:   如果没有立即获得锁,等待指定时间s  
    -o, --close:     在运行命令前关闭文件的描述符号。用于如果命令产生子进程时会不受锁的管控      (表示当执行command前关闭设置锁的FD,以使command的子进程不保持锁。)   -c, --command:   在shell中运行一个单独的命令  
    -h, --help       显示帮助 
    -V, --version:   显示版本

    补充说明:  

    共享锁:允许多个线程同时获取锁,并发访问  

    独占锁

    -o 举例:  

      不加-o参数。./down.sh执行完毕后,锁继续保留。(nohup后台运行的进程会继续持有锁)   

            VM05:/opt/*/bin # lsof |grep /opt/test.lk
            VM05:/opt/*/bin # ./down.sh
            VM05:/opt/*/bin # flock -x /opt/test.lk -c '/opt/*/*/run.sh';echo $?
            GATE              START
            0
            VM05:/opt/*/bin # lsof |grep /opt/test.lk
            java      98329       root    3u      REG              202,9        0         19 /opt/test.lk
            VM05:/opt/*/bin # ps 98329
               PID TTY      STAT   TIME COMMAND
             98329 pts/1    Sl     0:08 /usr/java/jdk1.6.0_29/bin/java -DProc=...

       加上-o参数。run.sh执行完毕后,锁释放。(run.sh的子进程不会持有锁。)   

            VM05:/opt/*/bin # ./down.sh
            VM05:/opt/*/bin # lsof |grep /opt/test.lk
            VM05:/opt/*/bin # flock -xo /opt/test.lk -c '/opt/*/bin/run.sh';echo $?
            GATE              START
            0
            VM05:/opt/*/bin # lsof |grep /opt/test.lk
            VM05:/opt/*/bin #

      @其他具体实践运用:

     1、 crontab运用flock防止重复执行

       * * * * * (flock -xn ./test.lock -c "sh /root/test.sh") #-n 为非阻塞模式

     2、 机器down机自动启动或重启

       可以在daemon开始的时候, 获取一个文件写锁. 守护脚本也设置阻塞模式锁, 一旦文件写锁获得成功, 则说明daemon已经挂了. 此时守护脚本重启daemon并放弃写锁. 

       flock -x ./test.lock -c "/usr/local/nginx/sbin/nginx" #去掉-n表示使用阻塞模式

  • 相关阅读:
    84. Largest Rectangle in Histogram (Solution 2)
    84. Largest Rectangle in Histogram (Solution 1)
    73. Set Matrix Zeroes
    【JavaScript】Symbol 静态方法
    【JavaScript】Date
    【JavaScript】Math
    725. Split Linked List in Parts把链表分成长度不超过1的若干部分
    791. Custom Sort String字符串保持字母一样,位置可以变
    508. Most Frequent Subtree Sum 最频繁的子树和
    762. Prime Number of Set Bits in Binary Representation二进制中有质数个1的数量
  • 原文地址:https://www.cnblogs.com/eaglediao/p/6501529.html
Copyright © 2011-2022 走看看