排他性(不能重复启动)Server开发

 

排他性(不能重复启动)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;
        */
      
 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="

你可能感兴趣的:(数据结构,linux,server,struct,shell,脚本)