Файл блокировки должен работать хорошо, если файл блокировки существует, то какой-то процесс использует целевой файл, а другим процессам придется ждать.
Если у вас есть пакет lockfile-progs
, вы можете использовать его для проверки существующей действительной блокировки (в течение последних 5 минут) с помощью lockfile-check
и аналогичных lockfile-create
& lockfile-remove
.
Обратите внимание, что эти файлы блокировки не блокируют и не блокируют доступ к файлу, а просто информативны, поэтому ваши сценарии знают, что они не должны мешать друг другу.
lockfile-create
есть задержка по умолчанию, если файл блокировки уже существует, прежде чем продолжить, он будет ждать, пока файл не будет разблокирован. Вот исключение из справочной страницы:
-r retry-count, --retry retry-count
Попробуйте заблокировать время повторного подсчета имени файла, прежде чем сдаться. Каждая попытка будет задержана немного дольше, чем последняя (с шагом 5 секунд), пока не будет достигнута максимальная задержка в одну минуту между повторными попытками. Если число повторов не указано, по умолчанию используется значение 9, которое прекращается через 180 секунд (3 минуты), если все 9 попыток блокировки завершатся неудачно.
Вот базовый пример, разрешающий использование нескольких команд, пока файл file.cfg заблокирован (включая выход при сбое lockfile-create
), но смотрите страницу man для более подробной информации.
lockfile-create file.cfg || { echo "lockfile-create failed, exiting now"; exit; }
...
sed -i ... file.cfg
...
lockfile-remove file.cfg
Если вам нужен файл блокировки более 5 минут, используйте lockfile-touch
чтобы «работать вечно, касаясь замка раз в минуту, пока не будет убит». Вот выдержка из справочной страницы:
Locking a file during a lengthy process:
lockfile-create /some/file
lockfile-touch /some/file &
# Save the PID of the lockfile-touch process
BADGER="$!"
do-something-important-with /some/file
kill "${BADGER}"
lockfile-remove /some/file
Если вы действительно хотите сделать что-то особенное в ожидании разблокировки файла, вы можете использовать цикл while, подобный этому, но между проверкой и блокировкой файла может быть окно в несколько миллисекунд (0,003 с в моих time
тестах), но тогда lockfile-create просто подождет, пока все будет безопасно.
while lockfile-check file.cfg
do
echo doing stuff waiting for lock to clear
sleep 1
done
lockfile-create file.cfg || exit
...
sed -i ... file.cfg
...
lockfile-remove file.cfg
И пока оба сценария используют и уважают файлы блокировки, sed
никогда не сможет заменить файл, пока он разблокирован, поэтому не должно быть конфликтов копирования и переименования файлов.
Или есть другие похожие варианты, такие как:
dotlockfile
- ваш собственный
test -a FILE
и touch
...
flock
как в ответе Камиля, находится в пакете coreutils
, что приятно
- Сохраните значения в программе базы данных, которая может безопасно обрабатывать одновременный доступ