🐧 Использование команды flock на Linux |

🐧 Использование команды flock на Linux

Мануал

Команда flock в Linux управляет блокировками файлов из скрипта или командной строки, обеспечивая одновременный доступ к файлу только одного процесса, чтобы предотвратить повреждение данных, вызванное одновременным доступом нескольких процессов к одному файлу.

Проще говоря, flock (file lock) блокирует файл так, что только один процесс может получить доступ к файлу, и ограничивает другие процессы в использовании этого файла, чтобы предотвратить повреждение данных, которое обычно происходит, когда несколько процессов пытаются использовать один файл.

В этом руководстве мы расскажем вам о том, как использовать команду flock на нескольких примерах.

Как использовать команду flock на Linux

Чтобы начать работу с командой flock, рекомендуется сначала изучить синтаксис команды.

Итак, вот основной синтаксис, которому нужно следовать, чтобы использовать команду flock:

flock [options] file [command]

Где:,

  • [options]: используется для изменения поведения команды flock по умолчанию.
  • file: здесь указывается целевой файл для команды flock.
  • [command]: необязательный параметр, в котором указывается команда, которая должна быть выполнена после того, как flock получит блокировку.

Теперь давайте рассмотрим несколько практических примеров использования команды flock.

1. Подождать, пока блокировка не будет снята (поведение по умолчанию).

Итак, вы хотите заблокировать файл и применить к нему команду, но что делать, если блокировка уже получена другим процессом?

Что ж, подождать, пока блокировка будет освобождена, – хорошая идея.

Для этого вам не нужны никакие дополнительные флаги, это стандартное поведение флока – ждать, пока блокировка не будет освобождена.

Вот как это делается:

flock /path/to/file --command "the_actual_command"

Чтобы продемонстрировать это, я использовал команду flock на одном и том же файле рядом друг с другом, так что первое выполнение сначала получит блокировку, а второе будет ждать, пока она не будет снята.

Я буду использовать команду sleep с одной стороны и команду echo с другой:

Как видите, сначала я выполнил команду sleep в левом окне, что означает, что блокировка была получена на 3 секунды, в то время как команда в правом окне тоже была выполнена.

Таким образом, команда echo (выполняемая в правом окне) должна была подождать 3 секунды перед выполнением.

2. Остановиться, если файл заблокирован

Хотя ожидание освобождения блокировки файла – отличная идея, иногда мы хотим сделать все быстро, и если файл заблокирован, вам может понадобиться изменить свой подход, а не ждать освобождения блокировки.

Для этого нужно использовать флаг -n, как показано здесь:

flock -n /path/to/file --command "the_actual_command"

Вот как он будет вести себя, если целевой файл заблокирован:

В приведенном выше примере в левом окне есть команда, которая блокирует файл на 3 секунды, а правое окно пытается получить доступ к тому же файлу, когда указанный файл заблокирован.

В результате оно ничего не возвращает и не ждет, пока блокировка файла будет снята.

3. Использование общей блокировки

Также известна как блокировка чтения, которая позволяет нескольким процессам одновременно получать доступ к общему ресурсу, не мешая друг другу.

Она полезна, когда вы хотите разрешить нескольким процессам читать определенные файлы, но хотите ограничить доступ на запись.

Чтобы использовать общую блокировку, вы можете использовать флаг -s, как показано здесь:

flock -s /path/to/file <command_to_execute>

Для справки, я буду использовать флаг -s дважды в один и тот же момент, и поскольку обе команды пытаются прочитать только содержимое файла, они обе будут выполнены.

4. Разблокируем файл

Хотя блокировка будет снята автоматически, вы можете оказаться в ситуации, когда захотите снять блокировку и закончить работу.

Для этого нужно использовать флаг -u, как показано далее:

flock -u /path/to/file --command "actual_command"

Чтобы продемонстрировать это, я использую команду flock на файле, чтобы заблокировать его, а затем, с другой стороны, использую флаг -u.

Если бы я не использовал флаг -u, floack не позволил бы мне использовать файл.

см. также:

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий