Truyền nhiều lệnh cho đàn


11
flock -x -w 5 ~/counter.txt 'COUNTER=$(cat ~/counter.txt); echo $((COUNTER + 1)) > ~/counter.txt'

Làm thế nào tôi có thể chuyển nhiều lệnh đến flocknhư trong ví dụ trên?

Theo tôi hiểu, flocklấy các cờ khác nhau (-x cho độc quyền, -w cho thời gian chờ), sau đó tệp để khóa và sau đó là lệnh để chạy. Tôi không chắc chắn làm thế nào tôi có thể chuyển hai lệnh vào hàm này (đặt biến với nội dung của tệp bị khóa và sau đó tăng tệp này).

Mục tiêu của tôi ở đây là tạo ra sự gia tăng có phần nguyên tử cho một tệp bằng cách khóa nó mỗi khi tập lệnh cố gắng truy cập counter.txttệp.

Câu trả lời:


7

Gọi một cái vỏ rõ ràng.

flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) > ~/counter.txt'

Lưu ý rằng bất kỳ biến nào bạn thay đổi đều cục bộ với thể hiện shell đó. Ví dụ: COUNTERbiến sẽ không được cập nhật trong tập lệnh gọi: bạn sẽ phải đọc lại từ tệp (nhưng có thể nó đã thay đổi trong lúc này) hoặc là đầu ra của lệnh:

new_counter=$(flock -x -w 5 ~/counter.txt sh -c 'COUNTER=$(cat counter.txt); echo $((COUNTER + 1)) | tee ~/counter.txt')

tuyệt vời, cảm ơn rất nhiều Lời giải thích mà bạn cung cấp chắc chắn đã cứu tôi khỏi một giờ đau đầu khác
d -_- b

4

Hoặc bạn có thể đổ một bộ mô tả tập tin

exec {counterfd}<~/counter.txt
flock -x -w 5 "$counterfd"
COUNTER=$(cat ~/counter.txt)
COUNTER=$(( COUNTER +1 ))
echo "$COUNTER" >~/counter.txt
exec {counterfd}<&-

Điều này cũng có lợi ích là cho phép bạn sử dụng biến đếm trực tiếp, không giống như các cách tiếp cận dựa trên subshell.


Xin vui lòng giải thích exec {counterfd}? Về bản thân, lỗi Debian not found, nhưng nó trả về 0 khi chuyển hướng. Rất kỳ quặc.
Steve Almond

2

Công flockcụ này hơi khó sử dụng và trang man khá ngắn. Trang man cung cấp ba cách để sử dụng công cụ:

  • flock [options] <file|directory> <command> [command args]
  • flock [options] <file|directory> -c <command>
  • flock [options] <file descriptor number>

Cách câu hỏi này được diễn đạt tôi chắc chắn sẽ sử dụng hình thức thứ ba flock. Nếu bạn đi sâu hơn vào trang man, flockcó một số ví dụ hiển thị cú pháp chính xác để sử dụng biểu mẫu thứ ba:

#!/bin/bash
(
 flock -n 9 || exit 1
 echo "commands executed under lock..."
 echo "go here..."
) 9>/tmp/mylockfile

Tôi đã thêm #!/bin/bash.

Tôi đã sử dụng thành công hình thức này flock.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.