これは、ユーザーzgodaによる回答に基づいています。これは主に、ロック ファイルへの書き込みアクセスに関係する厄介な問題に対処します。特に、ロック ファイルが最初に によって作成された場合、ユーザー の書き込み権限がないため、別のユーザーがこのファイルを正常に書き換えることができなくなります。明らかな解決策は、全員の書き込み権限を持つファイルを作成することです。このソリューションは、私による別の回答にも基づいており、そのようなカスタム権限でファイルを作成する必要があります。この懸念は、プログラムが を含む任意のユーザーによって実行される可能性がある現実の世界では重要です。root
foo
foo
root
import fcntl, os, stat, tempfile
app_name = 'myapp' # <-- Customize this value
# Establish lock file settings
lf_name = '.{}.lock'.format(app_name)
lf_path = os.path.join(tempfile.gettempdir(), lf_name)
lf_flags = os.O_WRONLY | os.O_CREAT
lf_mode = stat.S_IWUSR | stat.S_IWGRP | stat.S_IWOTH # This is 0o222, i.e. 146
# Create lock file
# Regarding umask, see https://stackoverflow.com/a/15015748/832230
umask_original = os.umask(0)
try:
lf_fd = os.open(lf_path, lf_flags, lf_mode)
finally:
os.umask(umask_original)
# Try locking the file
try:
fcntl.lockf(lf_fd, fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
msg = ('Error: {} may already be running. Only one instance of it '
'can run at a time.'
).format('appname')
exit(msg)
上記のコードの制限は、予期しないアクセス許可を持つロック ファイルが既に存在する場合、それらのアクセス許可が修正されないことです。
ロック ファイルのディレクトリとして使用/var/run/<appname>/
したかったのですが、このディレクトリを作成するにはroot
権限が必要です。どのディレクトリを使用するかは、自分で決めることができます。
ロック ファイルへのファイル ハンドルを開く必要がないことに注意してください。