2014-05-14 19 views
5

Tôi có một tập hợp các tập lệnh shell thực hiện sao lưu trên hệ thống của tôi bằng cách sử dụng truecrypt và rsync. Tôi muốn tránh bất kỳ khả năng nào của các tập lệnh khác nhau này chạy cùng một lúc.đàn (1) không thể nhả khóa

Họ sử dụng flock trong một subshell, như mô tả trong manpage:

(
    flock -n 9 || exit 1 
    # ... commands executed under lock ... 
) 9>/var/lock/mylockfile 

Tuy nhiên, khóa luôn thất bại trong việc mua lại cho chạy tiếp theo (với trạng thái thoát 1).

Tuy nhiên fuser /var/lock/mylockfilelsof /var/lock/mylockfile không hiển thị gì.

Bây giờ, nếu tôi thêm các lệnh flock -u để mở khóa, như thế này:

(
    flock -n 9 || exit 1 
    # ... commands executed under lock ... 
    flock -u 9 
) 9>/var/lock/mylockfile 

Sau đó, kịch bản làm việc.

Tôi có sử dụng flock chính xác không? Có an toàn khi gọi flock -u bên trong khối không?

FYI Các tập lệnh phiền hà là các tập lệnh gọi là truecrypt trong khối lệnh.

Trả lời

4

Vấn đề là bạn đang chạy TrueCrypt ở chế độ nền, giữ fd mở. Bạn nên đóng fd để ngăn chặn các quá trình nền treo trên khóa.

Thay mã thực tế của bạn, đây là một trường hợp thử nghiệm:

foo() { 
    ( 
    flock -n 9 && echo "ok" || { echo failed; exit 1; } 
    sleep 10 & 
) 9> lock 
} 
foo; foo 

# Output: 
# ok 
# failed 

sleep được chia hai với fd 9 mở, gây ra khóa để được lưu giữ. Hãy đóng fd 9 khi tạo nền cho quá trình:

foo() { 
    ( 
    flock -n 9 && echo "ok" || { echo failed; exit 1; } 
    sleep 10 9>&- & 
    #   ^-------- Right here 
) 9> lock 
} 
foo; foo 

# Output: 
# ok 
# ok 
+0

Tuyệt vời, cảm ơn! Bạn thực sự là chính xác. Tôi đã đóng bộ mô tả tập tin khi gọi truecrypt (và loại bỏ các cuộc gọi 'flock -u') và nó hoạt động hoàn hảo ngay bây giờ. – QuasarDonkey

0

Khóa tệp liên tục và xử lý mọi điều kiện chủng tộc có thể sẽ biến đổi tập lệnh của bạn trong chương trình vỏ phức tạp.

Hãy xem để công cụ Flom: http://sourceforge.net/projects/flom/

với một cái gì đó như:

flom -- my_first_command & 
flom -- my_second_command & 

bạn có thể serialize chúng mà không cần tất cả các tác dụng phụ tối của khóa dựa tập tin dai dẳng. Dưới đây là một số ví dụ về trường hợp sử dụng có liên quan: http://sourceforge.net/p/flom/wiki/FLoM%20by%20examples/

Chúc mừng

Ch.F.

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