您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“腳本中怎么確保應用程序的唯一性”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“腳本中怎么確保應用程序的唯一性”這篇文章吧。
一 shell 腳本的解決方法
利用mkdir 的特性 創建已經存在的文件目錄則會失敗。程序第一次運行的時候可以創建一個 /tmp/lock文件夾,標示當前已經運行一個程序,當啟動第二個程序時,mkdir /tmp/lock 便會失敗。
#!/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 中斷 比較詳細的資料 《Linux命令之trap - 在腳本中處理信號》http://codingstandards.iteye.com/blog/836588
二 python 腳本的解決方法
網上搜索python 鎖定文件的時候,都會提示 fcntl 模塊。Python的文件鎖目前使用的是fcntl這個庫,它實際上為 Unix上的ioctl,flock和fcntl 函數提供了一個接口。
fcntl模塊的函數flock(file_handle, operation)
其中 file_handle 表示文件描述符,operation 指要進行的鎖操作,有如下幾種:
fcntl.LOCK_UN 解鎖:刪除floc()函數創建的鎖
fcntl.LOCK_EX 排他鎖:除加鎖進程外其他進程沒有對已加鎖文件讀寫訪問權限。
fcntl.LOCK_SH 共享鎖:所有進程沒有寫訪問權限,即使是加鎖進程也沒有。所有進程有讀訪問權限。
fcntl.LOCK_NB 非阻塞鎖: 此參數意味著函數不能獲得文件鎖就立即返回,否則,如果使用LOCK_EX/LOCK_SH請求加鎖不成功,則當前進程會等待獲得文件鎖。使用LOCK_NB可以在獲得這個排他鎖的情況下不阻塞該進程,LOCK_NB 也可以同LOCK_SH或LOCK_NB進行按位或(|)運算操作,比如fcnt.flock(file_handle,fcntl.LOCK_EX|fcntl.LOCK_NB),此時系統便不會阻塞當前的進程。
注意:
1. 對于文件的f.close() 操作會使文件鎖失效;
2. 主進程結束后文件鎖失效;
3. flock()的LOCK_EX是"勸告鎖",系統內核不會強制檢查鎖的狀態,需要在代碼中進行文件操作的地方顯式檢查才能生效。
測試腳本
腳本中使用is_running 函數對文件加鎖,time.sleep(10) 模擬長時間執行的程序,第一次運行lock.py 成功加鎖,在程序運行期間 再次運行lock.py ,獲取鎖時會失敗,并且及時退出程序。
#!/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 "給文件加鎖 ,請等待10s..."
except :
print '文件加鎖,無法執行,請稍后運行。'
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)
測試例子:
會話一
會話二
以上是“腳本中怎么確保應用程序的唯一性”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。