2008-11-28 24 views
9

đây là phương pháp chuẩn để tạo khóa bằng cách sử dụng hệ thống tệp. Ví dụ, visudo sử dụng nó:điều kiện chủng tộc trong khóa chung trên hồ sơ?

[ -f ".lock" ] && exit 1 
touch .lock 
# do something 
rm .lock 

1) Tôi đang bối rối, vì có một điều kiện chủng tộc, nhưng Linux sử dụng nó

2) là có một cách tốt hơn để khóa trên các tập tin từ vỏ?

3) hoặc tôi có phải sử dụng thư mục thay thế không?

Tìm thấy giải pháp: lockfile người đàn ông.

+1

Câu hỏi phải được đánh dấu "[đã giải quyết]" bằng cách chọn câu trả lời chứ không phải bằng cách chỉnh sửa tiêu đề và thêm "[đã giải quyết]". –

+0

vấn đề là, tôi không thể đánh dấu câu trả lời của riêng mình là "được chấp nhận" –

+2

Tôi không nghĩ câu trả lời của bạn là tốt nhất, thẳng thắn :) –

Trả lời

17

Có, thực sự có một điều kiện chủng tộc trong tập lệnh mẫu. Bạn có thể sử dụng tùy chọn noclobber của bash để có được một thất bại trong trường hợp của một cuộc đua, khi một kịch bản khác nhau lẻn vào giữa các thử nghiệm và liên lạc.

Nó được mô tả here. Tôi đã trích đoạn quan trọng, với một vài chú thích (bắt đầu bằng BK :):

Một giải pháp có thể có là sử dụng chuyển hướng IO và chế độ noclobber của bash, sẽ không chuyển hướng đến tệp hiện có . Chúng ta có thể sử dụng một cái gì đó tương tự như:

if (set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null; 
then 
    # BK: this will cause the lock file to be deleted in case of other exit 
    trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT 

    # critical-section BK: (the protected bit) 

    rm -f "$lockfile" 
    trap - INT TERM EXIT 
else 
    echo "Failed to acquire lockfile: $lockfile." 
    echo "Held by $(cat $lockfile)" 
fi 
+0

noclobber là hữu ích, cảm ơn –

+1

Cảm ơn! [Đăng lại tại đây] (http://stackoverflow.com/a/31955862/471376). – JamesThomasMoon1979

0

có vẻ như tôi đã tìm thấy một giải pháp dễ dàng hơn: người đàn ông lockfile

+1

Lưu ý rằng lockfile không di động - nó có thể không có sẵn; đó là một phần của procmail (AFAIK). –

+0

Vỏ Linux thậm chí còn kém hơn nữa :) –

+0

Vỏ có tính di động cao hơn so với procmail, cho đến nay bạn có nhiều khả năng bị bash hơn so với procmail. Tôi có bash trên Solaris, Linux, Mac và Windows ở đây. 'lockfile' không nằm trong bất kỳ thứ gì trong số chúng. –

8

Hãy thử lệnh bầy:

exec 200>"$LOCK_FILE" 
flock -e -n 200 || exit 1 

Nó sẽ thoát nếu tập tin khóa bị khóa. Nó là nguyên tử và nó sẽ hoạt động trên phiên bản NFS gần đây.

Tôi đã làm một thử nghiệm. Tôi đã tạo một tập tin truy cập với 0 trong nó và thực hiện như sau trong một vòng lặp trên hai máy chủ đồng thời 500 lần:

#!/bin/bash 

exec 200>/nfs/mount/testlock 
flock -e 200 

NO=`cat /nfs/mount/counter` 
echo "$NO" 
let NO=NO+1 
echo "$NO" > /nfs/mount/counter 

Một nút đang đấu với nhau cho khóa. Khi cả hai chạy xong nội dung tập tin là 1000. Tôi đã thử nhiều lần và nó luôn hoạt động!

Lưu ý: Máy khách NFS là RHEL 5.2 và máy chủ được sử dụng là NetApp.

+0

bài viết tuyệt vời! cảm ơn bạn – Janning

+0

Mức độ phù hợp tốt về đàn chiên: trong mẫu của tôi, tôi có nó trên Cygwin và Linux, nhưng không có Solaris hoặc Mac. –

+1

Bạn có thể giải thích cú pháp thêm một chút không? Tôi đặc biệt tự hỏi về "exec 200>" $ LOCK_FILE "'. Bạn sẽ thấy điều này với các trang của người đàn ông, nhưng câu trả lời của bạn sẽ tốt hơn nếu nó giải thích những gì các dòng này làm. –

Các vấn đề liên quan