Чи може хтось пояснити, як використовувати дескриптори flock та file для блокування файлу та запису в заблокований файл?


14

Оголена зі мною, оскільки я новачок у цьому flockінструменті, і я не використовував дескриптори файлів наскільки я знаю.

У мене є сценарій bash, який робить запит cURL і записує вихід у файл, який називається resp.txt. Мені потрібно створити ексклюзивний замок, щоб я міг писати у цей файл і не турбуватися про те, що кілька користувачів запускають сценарій та редагують текстовий файл одночасно.

Ось код, за яким я очікую заблокувати файл, виконати запит та записати у текстовий файл:

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

Це правильний шлях для цього? Мій фактичний сценарій трохи довший, ніж цей, але він, здається, зламається, коли я додаю flockсинтаксис до скрипту bash.

Якщо хтось міг би пояснити, як працюють ці дескриптори файлів, і дайте мені знати, чи правильно я блокую файл, це було б приголомшливо!

Відповіді:


8

Це невірно, тому що, роблячи це ( flock -e 200; ... ) 200> file, ви обрізаєте файл, file перш ніж отримати ексклюзивний замок. Я думаю, що вам слід зробити:

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

щоб розмістити замок на файлі, відкритому лише для читання.

Примітка. Деякі оболонки не підтримують дескриптори файлів більше 9. Більше того, дескриптор файлів із твердим кодом вже може використовуватися. З розширеними оболонками (bash, ksh93, zsh) можна зробити наступне:

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

Мені потрібна команда curl, хоч би записала у файл. Я нерозумію, як це flockпрацює? Я новачок у дескрипторах файлів: /
DuckPuncher

1
@DuckPuncher Механізм блокування є окремим від операцій читання / запису, які ви можете виконати у файлі. Отже, curlще можна записати у файл. Зауважте, що це може бути небезпечно (а може навіть не працювати) з NFS, але не використовуйте скрипт оболонки для блокування файлів через NFS. З bash, ви також можете відкрити файл для читання і запису: 200<> resp.txtале це не повинно нічого змінити.
vinc17
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.