スクリプトが指定されたパラメータを使用して一度だけ実行されるように、fcntlを介してロックを生成する必要があります。これを達成するために、指定されたパラメータを使用してファイルを生成し、そのファイルのロックを取得します。 Pythonで次のコードを書いた。作業を簡単にするために、ファイル名を「mylockfile」にハードコードしました。
import traceback
from errno import EACCES, EAGAIN
from fcntl import lockf, LOCK_EX, LOCK_NB
from time import sleep
import os
if __name__ == '__main__':
# Create lock file and write current pid into it
fd = open("mylockfile", 'w')
fd.write("%d " %os.getpid())
try:
x = lockf(fd, LOCK_EX | LOCK_NB)
print("Obtained lock")
# Do useful work
sleep(10)
except OSError as e:
# Terminate in case of error
if e.errno in (EACCES, EAGAIN):
print("Script already running")
print(e.errno)
# Traceback of OSError
traceback.print_exc()
fd.close()
exit(1)
# Do other useful work
これで問題は、スリープ状態になったときにmylockfileを手動で削除し、スクリプトの他のインスタンスを起動することです。また、以前のプロセスにまだ開かれたファイル記述子が添付されているため、ロックを取得できないことが予想されます。しかし、実際にロックを獲得しましたが、なぜこれが起こるのかわかりません。これが予想される動作である場合、ロックされたファイルが削除されないようにするにはどうすればよいですか?
ベストアンサー1
ロックされたファイルが削除されると、開いているファイル記述子とファイル名の間のすべての関係が失われます。したがって、新しいプロセスは実行中の他のプロセスがあることを取得できません。
ロックされたファイルが通常のUNIX権限を超えて削除されるのを防ぐ方法はありません。十分な権限が付与されると、ファイルは常に削除される可能性があります。プロセスは、ロックファイルがまだ存在するかどうかを定期的に確認し、それに応じて応答(ロックファイルを終了または再生成)できますが、これを完全に実行する方法はありません。