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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章