Я хочу иметь файл, который используется в качестве счетчика. Пользователь A запишет и увеличит это число, а пользователь B попросит прочитать файл. Возможно ли, что пользователь A может заблокировать этот файл, чтобы никто не мог читать или писать в него, пока запись пользователя A не будет завершена?
Я посмотрел в, flock
но не могу заставить его работать, как я ожидаю.
flock -x -w 5 /dev/shm/counter.txt echo "4" > /dev/shm/counter.txt && sleep 5
Если есть более подходящий способ получить этот инкрементный инкрементный файл, который тоже было бы здорово услышать!
Моя цель:
LOCK counter.txt; write to counter.txt;
в то же время
Read counter.txt; realize it's locked so wait until that lock is finished.
shell
shell-script
lock
d -_- б
источник
источник
&& sleep 5
выполняется после того, как стадо снимает блокировку.)flock
, но я поставлю это как отдельный вопрос. Спасибо Джон!Ответы:
Обработка команды Bash ниже может быть удивительной:
Сначала запускается Bash,
flock -x -w 5 /dev/shm/counter.txt echo "4" > /dev/shm/counter.txt
и, если он завершается успешно (снятие блокировки), он запускаетсяsleep 5
. Таким образом, блокировка не удерживается в течение 5 секунд, которые можно ожидать.Помимо
&
против&&
Если одна имеет две команды,
A
аB
затем:A & B
начинаетсяA
в фоновом режиме, а затем начинается,B
не дожидаясьA
окончания.A && B
запускаетсяA
, ожидает его завершения, а затем, если он успешно завершается (код выхода 0), запускаетсяB
. Если происходитA
сбой (ненулевой код выхода), тоB
он никогда не запускается.В сумме
&
и&&
два совершенно разных оператора списка.источник
A && B
,A
будет ждатьB
до конца.Блокировки файлов не являются обязательными 1 - то есть вы не можете заблокировать файл, чтобы другой процесс не мог получить к нему доступ. Блокировка файла означает, что если (другой) процесс проверяет, не заблокирован ли он, он узнает об этом.
Цель
flock
состоит в том, чтобы делать что-то вроде того, что вы хотите, но вы должны затем использовать егоflock
для каждой попытки доступа . Имейте в виду, что это блокировка звонков; отman flock
:1. Что делает эту функцию бесполезной, если вы используете ее, например, для безопасности, но это не является целью блокировок файлов - они предназначены для синхронизации, что вы и делаете. Пользователь Leo указал, что в ядре linux может быть нестандартная реализация обязательной блокировки файлов ( см. Это обсуждение ), основанная на исторических параллелях из других операционных систем * nix. Тем не менее, это выглядит только интерфейс уровня C.
источник
flock
каждый раз. очень полезно!Вы можете использовать «sh -c command ...» для запуска всей команды оболочки, включая перенаправление файлов, с удерживаемой блокировкой. Кроме того, поскольку вы используете файл в качестве счетчика, вам необходимо постоянно удерживать блокировку во время чтения и обратной записи. Таким образом, вы хотите сделать что-то вроде этого, чтобы увеличить счетчик и вернуть его новое значение:
Изменение знака плюс на знак минус должно уменьшить счетчик:
Я ожидаю, что вы инициализируете счетчик до того, как возникнет конфликт, так что не нужно беспокоиться о блокировке так рано:
Я не думаю, что вам когда-либо понадобится затушевывать значение счетчика, пока может возникнуть конфликт, но, если вы когда-либо это сделали, вы должны сделать это так:
Я думаю, вы понимаете, как сделать чтение, но я включаю его для полноты:
источник