Пропустить несколько команд для стаи

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

Как я могу передать несколько команд для flock как в примере выше?

Насколько я понимаю, flock принимает разные флаги (-x для эксклюзивного, -w для таймаута), затем файл для блокировки, а затем команду для запуска. Я не уверен, как передать две команды в эту функцию (установить переменную с содержимым заблокированного файла, а затем увеличить этот файл).

Моя цель здесь – создать несколько атомный приращение для файла, заблокировав его каждый раз, когда скрипт пытается получить доступ к файлу counter.txt .

3 Solutions collect form web for “Пропустить несколько команд для стаи”

Вызовите оболочку явно.

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

Обратите внимание, что любая переменная, которую вы изменяете, является локальной для экземпляра оболочки. Например, переменная COUNTER не будет обновляться в вызывающем скрипте: вы должны будете прочитать ее обратно из файла (но, возможно, это изменилось за это время) или в качестве вывода команды:

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

Или вы можете ставить файловый дескриптор

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

Это также позволяет вам напрямую использовать переменную счетчика, в отличие от подходов на основе подоболочек.

Инструмент flock немного сложно использовать, а справочная страница довольно короткая. Страница руководства содержит три способа использования инструмента:

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

То, как этот вопрос сформулирован, я определенно буду использовать третью форму flock . Если вы заходите дальше на странице man для flock есть примеры, которые показывают точный синтаксис для использования третьей формы:

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

Я добавил #!/bin/bash .

Я успешно использовал эту форму flock .

  • Задание zsh на пустой строке
  • Почему `` IFS = read` используется так часто, а не `IFS =; в то время как читать..`?
  • Назначить путь к переменной, которая не существует
  • Доступ к выделенному тексту из сценария?
  • Как добавить псевдоним системы?
  • Поиск файла в каталоге через скрипт bash
  • Сбой сценария: Ошибка синтаксиса: «(« неожиданно
  • Как я могу заставить iconv заменить входной файл на преобразованный вывод?
  • Есть ли способ, чтобы функция в моем сценарии bash автоматически запускалась при любой ошибке команды?
  • Точная настройка LS_COLORS для суффиксов каталога?
  • Повернуть список в одну строку с разделителем
  • Linux и Unix - лучшая ОС в мире.