이 사용자 zgoda하여 answer을 기반으로 구축. 주로 잠금 파일에 대한 쓰기 액세스와 관련된 까다로운 문제를 해결합니다. 특히 잠금 파일이 처음으로 root
에 의해 생성 된 경우 다른 사용자 foo
은 사용자 foo
에 대한 쓰기 권한이 없기 때문에이 파일을 더 이상 성공적으로 다시 작성할 수 없습니다. 분명한 해결책은 모든 사람에게 쓰기 권한을 가진 파일을 만드는 것입니다. 이 솔루션은 또한 사용자가 다른 사용자 정의 권한을 사용하여 파일을 만들어야하는 번거 로움으로 인해 다른 answer을 기반으로합니다. 이 우려는 실제 프로그램에서 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
권한이 필요합니다. 사용할 디렉토리를 직접 결정할 수 있습니다.
잠금 파일에 대한 파일 핸들을 열 필요가 없음에 유의하십시오.
관습에 따라, 이것은/var/run/아래에 있어야합니다. –
호기심에서 독점적 인 액세스를 위해 파일을 여는 것만으로 뮤텍스가 작동하지 않습니까? – Menkboy
Menkboy, 충돌이 발생했을 때 파일이 제대로 닫히면 완벽하게 작동하고 문제가 더욱 단순해질 것이라고 생각합니다. 고맙습니다. –