2011-07-29 3 views
20

Tôi đang tìm kiếm cơ chế mutex/semaphore/concurrency trong shell script. Xem xét tình huống sau: Trừ khi người dùng "a" không đóng tệp được chia sẻ, người dùng "b" không thể mở/cập nhật tệp đó. Tôi chỉ tự hỏi làm thế nào để thực hiện cơ chế mutex, semaphore, critical sections trong kịch bản lệnh shell.Có cơ chế mutex/semaphore nào trong các kịch bản lệnh shell không?

Một câu hỏi khác: Cách dễ nhất để triển khai locking mechanism [cấp tệp] trong shell scripting là gì?

+2

có thể trùng lặp của [Cách nhanh chóng và bẩn để đảm bảo chỉ một phiên bản của tập lệnh shell đang chạy tại một thời điểm] (http://stackoverflow.com/questions/185451/quick-and-dirty-way-to -chỉ-chỉ-một-thể-của-một-vỏ-kịch bản-là-chạy-tại) – tripleee

+0

Liên quan: https://unix.stackexchange.com/questions/70/what-unix-commands-can-be- được sử dụng-as-a-semaphore-lock –

Trả lời

9

Xem BashFAQProcessManagment để thảo luận về khóa tệp trong Bash.

Gắn thẻ câu hỏi của bạn dưới dạng trình bao (chỉ) giới hạn số người có thể giúp bạn. Bạn có thể muốn thêm unix, ksh, bash.

Có rất nhiều câu hỏi/câu trả lời về chủ đề này được đăng ở đây đã có trên S.O.

Tôi hy vọng điều này sẽ hữu ích.

+5

nếu đây là bản sao, bạn có thể chỉ cho một người cụ thể không? – momeara

+1

Tôi không nói đó là bản sao, ý định là chỉ một người dùng tương đối mới tìm kiếm kỹ hơn một chút thông qua S.O. Tôi tìm kiếm '[bash] tập tin khóa' và' [bash] mutex' và tìm thấy rất nhiều mà sẽ thêm quan điểm. Chúc may mắn. – shellter

31

BashFAQ được chú thích bởi trình bao bọc có một số ví dụ hay. Ý tưởng cơ bản, mà tôi đang di chuyển ở đây để trang được khép kín, là sử dụng một hoạt động mà cả hai kiểm tra và đặt cùng một lúc: mkdir

mkdir sẽ thất bại nếu thư mục tồn tại và sẽ thực hiện nếu nó không. Đó là một hoạt động nguyên tử và bạn có thể sử dụng nó như vậy để thực hiện một mutex trong kịch bản lệnh shell của bạn (từ BashFAQ ở trên)

# Bourne 
lockdir=/tmp/myscript.lock 
if mkdir "$lockdir" 
then # directory did not exist, but was created successfully 
    echo >&2 "successfully acquired lock: $lockdir" 
    # continue script 
else # failed to create the directory, presumably because it already exists 
    echo >&2 "cannot acquire lock, giving up on $lockdir" 
    exit 0 
fi 

theo liên kết để biết thêm chi tiết về dọn dẹp và các mục khác.

+4

Không phải là mục đích của khóa là để giữ cho đến khi khóa được phát hành. Kịch bản này có nên được như mkdir bên trong một vòng lặp while cho đến khi nó thành công và một khi công việc được thực hiện, kịch bản là giả sử để xóa các dir tmp? – Pocha

+0

@ Pocha đó là một cách mà nó có thể hoạt động nhưng bạn có thể không muốn kịch bản thoát ra với lời giải thích đó là lý do tôi đến đây). Nếu hành vi được mô tả là những gì bạn mong muốn thì có thể dễ dàng sửa đổi câu trả lời này để đạt được điều đó. – joelnb