này được dựa trên các answer của thành viên zgoda. Nó chủ yếu giải quyết một mối quan tâm khó khăn phải làm với ghi truy cập vào tập tin khóa. Đặc biệt, nếu tệp khóa được tạo lần đầu tiên bởi root
, một người dùng khác foo
có thể không còn cố gắng viết lại tệp này thành công nữa do thiếu quyền ghi cho người dùng foo
. Giải pháp hiển nhiên dường như là tạo tệp có quyền ghi cho mọi người. Giải pháp này cũng xây dựng dựa trên một khác nhau answer của tôi, phải làm việc tạo một tập tin với quyền tùy chỉnh như vậy. Mối quan tâm này rất quan trọng trong thế giới thực nơi chương trình của bạn có thể được điều hành bởi bất kỳ người dùng nào kể cả 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)
Hạn chế của mã trên là nếu tệp khóa đã tồn tại với quyền không mong muốn, các quyền đó sẽ không được sửa.
Tôi đã thích sử dụng /var/run/<appname>/
làm thư mục cho tệp khóa nhưng việc tạo thư mục này yêu cầu quyền đối với root
. Bạn có thể đưa ra quyết định của riêng mình để sử dụng thư mục nào.
Lưu ý rằng không cần mở trình xử lý tệp vào tệp khóa.
Nguồn
2013-02-22 04:18:27
Theo quy ước, điều này nên đi theo/var/run /, đúng không? –
Trong sự tò mò, không chỉ đơn giản là mở tập tin để truy cập độc quyền làm công việc của một mutex? – Menkboy
Menkboy, nếu tệp được đóng lại đúng cách trong trường hợp xảy ra sự cố, thì tôi nghĩ điều đó sẽ hoạt động hoàn hảo và đơn giản hóa mọi thứ hơn nữa. Cảm ơn bạn. –