ロックファイルを使った多重起動防止

| | | | | | |



要約すると、二股かけないように監視するプログラム
(。。。ちょっとふざけすぎました)
たまに操作を間違えて、同じ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:

Related posts

Tags:

Comments are closed.