[pukiwiki]
要約すると、”二股かけないように監視するプログラム”
(。。。ちょっとふざけすぎました)
たまに操作を間違えて、同じPythonプログラムを多重起動してしまいます。
(データベースを扱う際などに困る)
これを防ぐのにどうしたらいいか判らなかったので、掲示板CGIなどでよく使われてるロックファイルを使ったクラスを書いてみました。
以下コード
[/pukiwiki]
[pukiwiki]
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()
[/pukiwiki]