私はPython 2.7
スクリプトを書いています。
要約すると、このスクリプトは毎晩実行されLinux
、いくつかのプロセスをアクティブにします。
このスクリプトが複数回並行して実行されないようにしたいと思います (基本的にはSingleton
パターンを模倣しようとしていますが、アプリケーション レベルで)。
コード例
def main():
# before doing anything, I'd like to know whether this
# script was activated and alive.
# if so, error out
# do something
if __name__ == "__main__":
main()
提案
単純な解決策は、ミューテックスとして機能するある種のロック ファイルを作成することです。
最初に、このファイルが存在するかどうかを確認します。もしそうなら、スクリプトの他のインスタンスがすでにそれを作成しているため、エラーが発生するはずです。スクリプトが完了したら、このファイルを削除します。
ファイル システムでの操作がアトミックである限り、このソリューションは機能すると思います。
実装
import os, sys
lock_file_path = ".lock_script"
def lock_mutex():
if os.path.exists(lock_mutex_path):
print "Error: script was already activated."
sys.exit(-1)
else:
file = open(lock_mutex_path, 'w')
def unlock_mutex():
assert( os.path.exists(lock_mutex_path))
os.remove(lock_mutex_path)
def main():
try:
lock_mutex()
# do something
unlock_mutex()
except:
unlock_mutex()
if __name__ == "__main__":
main()
問題
アトミックlock_mutex()
であることを保証する方法は?unlock_mutex()