Czy ktoś może wyjaśnić, jak używać flocków i deskryptorów plików do blokowania pliku i zapisywania w zablokowanym pliku?

14

Nareszcie ze mną, bo jestem nowy w tym flocknarzędziu i o ile wiem, nie używałem deskryptorów plików.

Mam skrypt bash, który wysyła żądanie cURL i zapisuje dane wyjściowe w pliku o nazwie resp.txt. Muszę utworzyć wyłączną blokadę, aby móc pisać do tego pliku i nie martwić się o to, że wielu użytkowników jednocześnie uruchamia skrypt i edytuje plik tekstowy.

Oto kod, który oczekuję, aby zablokować plik, wykonać żądanie i zapisać w pliku tekstowym:

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

Czy to jest właściwy sposób, aby to zrobić? Mój rzeczywisty skrypt jest nieco dłuższy, ale wydaje się, że się psuje, gdy dodam flockskładnię do skryptu bash.

Gdyby ktoś mógł wyjaśnić, jak działają te deskryptory plików i poinformować mnie, czy poprawnie blokuję plik, byłoby to niesamowite!

DuckPuncher
źródło

Odpowiedzi:

8

To nie jest poprawne, ponieważ kiedy to robisz ( flock -e 200; ... ) 200> file, obcinasz plik, file zanim uzyskasz wyłączną blokadę. Myślę, że powinieneś zrobić:

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

aby zablokować plik otwarty jako tylko do odczytu.

Uwaga. Niektóre powłoki nie obsługują deskryptorów plików większych niż 9. Co więcej, można już użyć wbudowanego deskryptora pliku. Dzięki zaawansowanym powłokom (bash, ksh93, zsh) można wykonać następujące czynności:

touch resp.txt
(
  unset foo
  exec {foo}< resp.txt
  flock -e $foo
  curl 'someurl' -H 'someHeader' > resp.txt
)
vinc17
źródło
Potrzebuję jednak polecenia curl, aby zapisać do pliku. Czy nie rozumiem, jak flockdziała? Jestem nowy w deskryptorach plików: /
DuckPuncher
1
@DuckPuncher Mechanizm blokujący jest niezależny od operacji odczytu / zapisu, które można wykonać na pliku. Więc curlnadal można zapisać do pliku. Zauważ, że może to być niebezpieczne (lub nawet nie działać) z NFS, ale nie używaj skryptu powłoki do blokowania plików przez NFS. Za pomocą bashmożna również otworzyć plik do odczytu i zapisu: 200<> resp.txtale to nic nie powinno zmienić.
vinc17