Server开发(deamon)进程排他性(文件锁),脚本排他性(fuser)



1、进程排他性:
      在linux中进行Server开发::
      第一步、deamon()              //调用deamon将进程转后台。
      第二步、加文件写锁:
            fd = open(“filename”,O_CREAT|O_WRONLY,0666);
            struct  flock  stLock;
            /*文件锁的数据结构*/
            stLock.l_type  =  F_WRLCK;
            /*l_type的取值可以是:F_WRLCK、F_RDLCK或F_UNLCK*/
           stLock.l_whence  =  SEEK_SET;
           /*l_whence的取值可以是:SEEK_SET、SEEK_CUR、SEEK_END*/
           stLock.l_start  =  0;
           /*偏移字节,相对于whence的偏移字节*/ 
           stLock.l_len = 0;
          /*
                  从l_whence+l_start开始,对文件中的l_len个字节加锁,
                  0表示加锁到EOF,即文件结束。
          */
        fcntl(fd,F_SETLK,&stLock);
        /*
               加锁时,cmd可以取值F_SETLK或F_SETLKW;
        */
       注意:deamon和下面的顺序不能调整,文件一旦关闭,文件锁就将被释放。
 2、脚本排他性:  
         (
               fuser  filename,查看使用filename的进程PID,
               注意::vim   filename这种监控不到。
               fuser  filename   可以查看使用filename的进程PID,
               通过这个简介的判断filename(可执行程序)有没有运行,
               当然,也不一定完全合理,可能只在编译,也被认为是已经启动了。
               (不过,这个确实已经是最好的方法了。)
        )
      
        如果在脚本上加上个排他性的检查,发现该脚本正在执行的时候,第二次的执行就自动退出并给出提示可以避免一些人为的疏忽。
       下面是一个例子
通过fuser来检查当前脚本是否正在执行,如果正在执行则提示并退出脚本。
#!/bin/bash
if fuser $0 2> /dev/null | sed "s/\\<$$\\>//" | grep -q '[0-9]'; then
    echo 'Script is already running...' 1>&2
    exit 1
fi
      
#program starts here        #即在这里编写自己的shell脚本

sleep 60
echo "=end="

脚本的排他性,方法二 获取已经启动的进程的数量:
#!/bin/sh

if [ $# -lt 1 ]; then 
    echo "Usage: proc"
    exit -1 
fi

proc="$1"
self=$(basename $0)

curnum=`ps -ef|grep -v "/bin/sh -c"|grep -v grep|grep -v "$self"|grep -w "${proc}"|wc -l`

echo $curnum

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值