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