Ai đó có thể giải thích làm thế nào để sử dụng mô tả đàn và tập tin để khóa một tập tin và ghi vào tập tin bị khóa?


14

Làm quen với tôi khi tôi chưa quen với flockcông cụ này và tôi chưa sử dụng các mô tả tệp theo như tôi biết.

Tôi có một tập lệnh bash tạo một yêu cầu cURL và ghi đầu ra vào một tệp có tên resp.txt. Tôi cần tạo một khóa độc quyền để tôi có thể ghi vào tệp đó và không lo lắng về việc nhiều người dùng chạy tập lệnh và chỉnh sửa tệp văn bản cùng một lúc.

Đây là mã mà tôi mong đợi để khóa tệp, thực hiện yêu cầu và ghi vào tệp văn bản:

(
flock -e 200
curl 'someurl' -H 'someHeader' > resp.txt
) 200>/home/user/ITS/resp.txt

Đây có phải là cách chính xác để đi về điều này? Kịch bản thực tế của tôi dài hơn một chút so với điều này, nhưng nó dường như bị hỏng khi tôi thêm flockcú pháp vào tập lệnh bash.

Nếu ai đó có thể giải thích cách các mô tả tệp này hoạt động và cho tôi biết nếu tôi khóa tệp chính xác thì điều đó thật tuyệt vời!

Câu trả lời:


8

Điều này là không chính xác bởi vì khi bạn làm ( flock -e 200; ... ) 200> file, bạn đang cắt bớt tệp file trước khi bạn có được khóa độc quyền. Tôi nghĩ rằng bạn nên làm:

touch resp.txt
(
  flock -e 200
  curl 'someurl' -H 'someHeader' > resp.txt
) 200< resp.txt

để đặt khóa trên tệp được mở dưới dạng chỉ đọc.

Ghi chú. Một số shell không hỗ trợ bộ mô tả tệp lớn hơn 9. Ngoài ra, bộ mô tả tệp được mã hóa cứng có thể đã được sử dụng. Với hệ vỏ tiên tiến (bash, ksh93, zsh), có thể thực hiện như sau:

touch resp.txt
(
  unset foo
  exec {foo}< resp.txt
  flock -e $foo
  curl 'someurl' -H 'someHeader' > resp.txt
)

Tôi cần lệnh curl sẽ ghi vào tập tin mặc dù. Tôi có hiểu lầm làm thế nào flockhoạt động? Tôi chưa quen với phần mô tả tệp: /
DuckPuncher

1
@DuckPuncher Cơ chế khóa tách biệt với các thao tác đọc / ghi mà bạn có thể thực hiện trên tệp. Vì vậy, curlvẫn có thể ghi vào tập tin. Lưu ý rằng điều này có thể không an toàn (hoặc thậm chí có thể không hoạt động) với NFS, nhưng không sử dụng tập lệnh shell để khóa tệp qua NFS. Với bash, bạn cũng có thể mở tệp cho cả đọc và viết: 200<> resp.txtnhưng điều này không nên thay đổi bất cứ điều gì.
vinc17
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.