您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“腳本中怎么確保應(yīng)用程序的唯一性”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“腳本中怎么確保應(yīng)用程序的唯一性”這篇文章吧。
一 shell 腳本的解決方法
利用mkdir 的特性 創(chuàng)建已經(jīng)存在的文件目錄則會(huì)失敗。程序第一次運(yùn)行的時(shí)候可以創(chuàng)建一個(gè) /tmp/lock文件夾,標(biāo)示當(dāng)前已經(jīng)運(yùn)行一個(gè)程序,當(dāng)啟動(dòng)第二個(gè)程序時(shí),mkdir /tmp/lock 便會(huì)失敗。
#!/bin/bash
mkdir /tmp/lock
if [ $? -ne 0 ];then
echo "there is tr script running .. "
exit 1
fi
trap "rm -fr /tmp/lock " SIGINT SIGTERM
sleep 50
if [ -d /tmp/lock ];then
rm -fr /tmp/lock
echo "rm -fr /tmp/lock"
fi
注意 linux中的trap命令是防止腳本異常終止 :被kill (不是kill -9) ,crtl+c 中斷 比較詳細(xì)的資料 《Linux命令之trap - 在腳本中處理信號(hào)》http://codingstandards.iteye.com/blog/836588
二 python 腳本的解決方法
網(wǎng)上搜索python 鎖定文件的時(shí)候,都會(huì)提示 fcntl 模塊。Python的文件鎖目前使用的是fcntl這個(gè)庫(kù),它實(shí)際上為 Unix上的ioctl,flock和fcntl 函數(shù)提供了一個(gè)接口。
fcntl模塊的函數(shù)flock(file_handle, operation)
其中 file_handle 表示文件描述符,operation 指要進(jìn)行的鎖操作,有如下幾種:
fcntl.LOCK_UN 解鎖:刪除floc()函數(shù)創(chuàng)建的鎖
fcntl.LOCK_EX 排他鎖:除加鎖進(jìn)程外其他進(jìn)程沒(méi)有對(duì)已加鎖文件讀寫(xiě)訪問(wèn)權(quán)限。
fcntl.LOCK_SH 共享鎖:所有進(jìn)程沒(méi)有寫(xiě)訪問(wèn)權(quán)限,即使是加鎖進(jìn)程也沒(méi)有。所有進(jìn)程有讀訪問(wèn)權(quán)限。
fcntl.LOCK_NB 非阻塞鎖: 此參數(shù)意味著函數(shù)不能獲得文件鎖就立即返回,否則,如果使用LOCK_EX/LOCK_SH請(qǐng)求加鎖不成功,則當(dāng)前進(jìn)程會(huì)等待獲得文件鎖。使用LOCK_NB可以在獲得這個(gè)排他鎖的情況下不阻塞該進(jìn)程,LOCK_NB 也可以同LOCK_SH或LOCK_NB進(jìn)行按位或(|)運(yùn)算操作,比如fcnt.flock(file_handle,fcntl.LOCK_EX|fcntl.LOCK_NB),此時(shí)系統(tǒng)便不會(huì)阻塞當(dāng)前的進(jìn)程。
注意:
1. 對(duì)于文件的f.close() 操作會(huì)使文件鎖失效;
2. 主進(jìn)程結(jié)束后文件鎖失效;
3. flock()的LOCK_EX是"勸告鎖",系統(tǒng)內(nèi)核不會(huì)強(qiáng)制檢查鎖的狀態(tài),需要在代碼中進(jìn)行文件操作的地方顯式檢查才能生效。
測(cè)試腳本
腳本中使用is_running 函數(shù)對(duì)文件加鎖,time.sleep(10) 模擬長(zhǎng)時(shí)間執(zhí)行的程序,第一次運(yùn)行l(wèi)ock.py 成功加鎖,在程序運(yùn)行期間 再次運(yùn)行l(wèi)ock.py ,獲取鎖時(shí)會(huì)失敗,并且及時(shí)退出程序。
#!/usr/bin/python2.6
#coding:utf8
import time
import fcntl
import sys
def is_running(file):
lock_file=open(file,"w")
try:
fcntl.lockf(lock_file,fcntl.LOCK_EX|fcntl.LOCK_NB)
print "給文件加鎖 ,請(qǐng)等待10s..."
except :
print '文件加鎖,無(wú)法執(zhí)行,請(qǐng)稍后運(yùn)行。'
return None
return lock_file
if __name__ == "__main__":
lockfile="/tmp/rsync_is_running"
a=is_running(lockfile)
if a is None :
print "lock file failed , rsync is running .quit ..."
sys.exit(0)
else :
print "lock file successed !!! "
time.sleep(10)
測(cè)試?yán)?
會(huì)話一
會(huì)話二
以上是“腳本中怎么確保應(yīng)用程序的唯一性”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。