состояние гонки в общей блокировке файла? - PullRequest
13 голосов
/ 28 ноября 2008

это стандартный подход для создания блокировок с использованием файловой системы. Например, Visudo использует его:

[ -f ".lock" ] && exit 1
touch .lock
# do something
rm .lock

1) Я в замешательстве, потому что есть состояние гонки, но Linux использует его

2) есть ли лучший способ заблокировать файлы из оболочки?

3) или я должен вместо этого использовать каталоги?

Найденное решение: man lockfile.

Ответы [ 4 ]

21 голосов
/ 28 ноября 2008

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

Это описано здесь . Я выдержал критическую часть с парой аннотаций (с префиксом BK:):

Возможное решение этой проблемы - использовать перенаправление ввода-вывода и режим boc noclobber, который не будет перенаправлять на существующий файл. Мы можем использовать что-то похожее на:

if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null; 
then
   # BK: this will cause the lock file to be deleted in case of other exit
   trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT

   # critical-section BK: (the protected bit)

   rm -f "$lockfile"
   trap - INT TERM EXIT
else
   echo "Failed to acquire lockfile: $lockfile." 
   echo "Held by $(cat $lockfile)"
fi
9 голосов
/ 15 октября 2009

Попробуйте команду flock:

exec 200>"$LOCK_FILE"
flock -e -n 200 || exit 1

Он выйдет, если файл блокировки заблокирован. Он атомарный и будет работать над последней версией NFS.

Я сделал тест. Я создал файл счетчика с 0 и выполнил следующее в цикле на двух серверах одновременно 500 раз:

#!/bin/bash

exec 200>/nfs/mount/testlock
flock -e 200

NO=`cat /nfs/mount/counter`
echo "$NO"
let NO=NO+1
echo "$NO" > /nfs/mount/counter

Один узел сражался с другим за блокировку. По завершении обоих запусков содержимое файла составило 1000. Я пробовал несколько раз, и это всегда работает!

Примечание. NFS-клиент - RHEL 5.2, а используемый сервер - NetApp.

2 голосов
/ 06 марта 2011

Блокировка вашего скрипта (против параллельного запуска)

http://wiki.bash -hackers.org / HOWTO / мьютекс

FYI.

0 голосов
/ 28 ноября 2008

кажется, я нашел более простое решение: man lockfile

...