shell 实现写文件互斥

本文详细解释了Linux文件锁的四种类型及其作用,通过实例展示了如何使用flock命令实现文件锁,并深入探讨了锁选项如-s、-e、-u、-n、-w等的功能和应用场景。

介绍一下参数:   

         -s        为共享锁,在定向为某文件的        FD        上设置共享锁而未释放锁的时间内,其他进程试图在定向为此文件的        FD        上设置独占锁的请求失败,而其他进程试图在定向为此文件的        FD        上设置共享锁的请求会成功。            

             -e        为独占或排他锁,在定向为某文件的        FD        上设置独占锁而未释放锁的时间内,其他进程试图在定向为此文件的        FD        上设置共享锁或独占锁都会失败。只要未设置        -s        参数,此参数默认被设置。            

             -u        手动解锁,一般情况不必须,当        FD        关闭时,系统会自动解锁,此参数用于脚本命令一部分需要异步执行,一部分可以同步执行的情况。            

             -n        为非阻塞模式,当试图设置锁失败,采用非阻塞模式,直接返回        1        ,并继续执行下面语句。            

             -w        设置阻塞超时,当超过设置的秒数,就跳出阻塞,返回值设置为        1        ,并继续执行下面语句。            

             -o        必须是使用第一种格式时才可用,表示当执行        command        前关闭设置锁的        FD        ,以使        command        的子进程不保持锁。            

             -c        执行其后的        comand        。            

     举个实用的例子:      

           

     [lingyun@localhost rootfs]$ cat mylockfile.sh       

    
      #!/bin/sh      

      

      set -x      

      

      #exec 6<>"mylockfile.sh"      

      

      {      

          flock -n 6      

      

          #[ "$?" -eq "1" ] && {echo "fail";exit;}      

          if [ "$?" -eq "1" ] ; then      

              echo "fail";      

              exit;      

          fi      

          echo $$      

      

          sleep 10      

      } 6<>"mylockfile.sh"


     [lingyun@localhost rootfs]$       

     [lingyun@localhost rootfs]$ chmod a+x mylockfile.sh       

             第一个终端        :        
       [lingyun@localhost rootfs]$ sh mylockfile.sh         
       + flock -n 6        
       + '['        0        -eq 1 ']'        
       + echo 27292        
       27292        
       + sleep 10          
 

     睡眠10秒钟,同时我在另一个终端上运行这个脚本会出现如下情形:      

     第二个终端:      

             [lingyun@localhost rootfs]$ sh mylockfile.sh         
       + flock -n 6        
       + '['        1        -eq 1 ']'        
       + echo fail        
       fail        
       + exit        
       
         
 

     所以理解-n选项后就会明白了      


转载于:https://my.oschina.net/hao7234/blog/271831

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值