溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

腳本中怎么確保應(yīng)用程序的唯一性

發(fā)布時(shí)間:2021-12-20 09:41:19 來(lái)源:億速云 閱讀:140 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要為大家展示了“腳本中怎么確保應(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ì)失敗。

  1. #!/bin/bash

  2. mkdir /tmp/lock

  3. if [ $? -ne 0 ];then

  4.    echo "there is  tr script running .. "

  5.    exit 1

  6. fi

  7. trap "rm -fr /tmp/lock " SIGINT SIGTERM

  8. sleep 50

  9. if [ -d  /tmp/lock ];then

  10.    rm -fr /tmp/lock

  11.    echo "rm -fr /tmp/lock"

  12. 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í)退出程序。

  1. #!/usr/bin/python2.6

  2. #coding:utf8

  3. import time

  4. import fcntl

  5. import sys

  6. def is_running(file):

  7.     lock_file=open(file,"w")

  8.     try:

  9.         fcntl.lockf(lock_file,fcntl.LOCK_EX|fcntl.LOCK_NB)

  10.         print "給文件加鎖 ,請(qǐng)等待10s..."

  11.     except :

  12.         print '文件加鎖,無(wú)法執(zhí)行,請(qǐng)稍后運(yùn)行。'

  13.         return None

  14.     return lock_file


  15. if __name__ == "__main__":

  16.     lockfile="/tmp/rsync_is_running"

  17.     a=is_running(lockfile)

  18.     if a is None :

  19.       print "lock file failed , rsync is running .quit ..."

  20.       sys.exit(0)

  21.     else :

  22.       print "lock file successed !!! "

  23.     time.sleep(10)

測(cè)試?yán)?
會(huì)話一
腳本中怎么確保應(yīng)用程序的唯一性
會(huì)話二
腳本中怎么確保應(yīng)用程序的唯一性

以上是“腳本中怎么確保應(yīng)用程序的唯一性”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI