ロックファイルを使った多重起動防止
要約すると、二股かけないように監視するプログラム
(。。。ちょっとふざけすぎました)
たまに操作を間違えて、同じPythonプログラムを多重起動してしまいます。
(データベースを扱う際などに困る)
これを防ぐのにどうしたらいいか判らなかったので、掲示板CGIなどでよく使われてるロックファイルを使ったクラスを書いてみました。
以下コード
Python Cookbookを漁れば既に有るような気もしたのですが。
(標準ライブラリに既に同等品が有るかも。。。)
・・・あとで書き直すかも。
以下を適当なファイル名で保存、多重起動を防止したいファイルからインポートするだけ、というお手軽さ。
#インポートしただけで、ってのは、逆にマズイ場合もある気がします。
import os
import sys
import time
import stat
class Lockfile(object):
d=os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])),"lock")
l=os.path.join(d,"lockfile")
def lock(self,l=None):
#あらかじめ、実行メインファイルと同じ場所に
#lockというフォルダを作成する。
#または、以下2行をコメントアウト
#if not os.path.exists(self.d):
# os.mkdir(self.d)
if l : self.l=os.path.join(self.d,"lockfile")
if os.path.exists(self.l):
m=os.stat(self.l)[stat.ST_CTIME]-time.time()
#作成して30分経ってたらlockファイルを強制削除
if m<60*30 :
#assert False, "already running"
return False
else :
os.remove(self.l)
self.t=os.path.join( self.d,str(time.clock()))
try:
fp=open(self.t,"w").close()
except:
#assert False, "file create error"
return False
try:
os.rename(self.t,self.l)
except:
os.remove(self.t)
return False
return True
def unlock (self):
os.rename(self.l,self.t)
os.remove(self.t)
if __name__=="__main__" :
l=Lockfile()
ret=l.lock()
if not ret :
assert False,"already running"
else :
print raw_input("hit any key ")
l.unlock()
Tags: PythonRelated posts
Tags: Python






