Chcę mieć plik używany jako licznik. Użytkownik A zapisze i zwiększy ten numer, podczas gdy użytkownik B poprosi o odczytanie pliku. Czy to możliwe, że użytkownik A może zablokować ten plik, aby nikt nie mógł go odczytać ani zapisać, dopóki użytkownik A nie zakończy zapisu?
Przyjrzałem się temu, flock
ale wydaje mi się, że nie mogę go uruchomić tak, jak się tego spodziewam.
flock -x -w 5 /dev/shm/counter.txt echo "4" > /dev/shm/counter.txt && sleep 5
Jeśli istnieje bardziej odpowiedni sposób na zdobycie tego podobnego do atomu pliku inkrementacyjnego, to też byłby świetny do usłyszenia!
Mój cel to:
LOCK counter.txt; write to counter.txt;
podczas gdy w tym samym czasie
Read counter.txt; realize it's locked so wait until that lock is finished.
shell
shell-script
lock
d -_- b
źródło
źródło
&& sleep 5
jest wykonywany po zwolnieniu blokady przez stado).flock
, ale postawię to jako osobne pytanie. Dzięki, John!Odpowiedzi:
Przetwarzanie przez Bash poniższego polecenia może być zaskakujące:
Najpierw uruchamia się Bash,
flock -x -w 5 /dev/shm/counter.txt echo "4" > /dev/shm/counter.txt
a jeśli zakończy się ono pomyślnie (zwolnienie blokady), to działasleep 5
. Dlatego blokada nie jest utrzymywana przez 5 sekund, których można oczekiwać.Na bok
&
kontra&&
Jeśli jeden ma dwa polecenia,
A
aB
następnie:A & B
zaczyna sięA
w tle, a następnie zaczynaB
bez oczekiwania naA
zakończenie.A && B
uruchamia sięA
, czeka na zakończenie, a następnie, jeśli zakończy się pomyślnie (kod wyjścia 0), rozpoczyna sięB
. Jeśli sięA
nie powiedzie (niezerowy kod wyjścia),B
to nigdy nie zostanie uruchomiony.W sumie,
&
i&&
są dwie zupełnie różne operatory list.źródło
A && B
,A
by czekaćB
do końca.Blokady plików nie są obowiązkowe 1 - tzn. Nie można zablokować pliku, aby inny proces nie mógł uzyskać do niego dostępu. Zablokowanie środków plików, jeśli A (kolizyjnego) Proces kontroli aby sprawdzić, czy został on zablokowany, będzie wiedział.
Celem tego
flock
jest robienie rzeczy takich, jak chcesz, ale musisz używać ichflock
przy każdej próbie dostępu . Pamiętaj, że blokują połączenia; zman flock
:1. Co sprawia, że funkcja wydaje się bezużyteczna, jeśli używasz jej np. Do bezpieczeństwa, ale nie jest to celem blokad plików - służą one do synchronizacji, czyli tego, co robisz. Użytkownik Leo zwrócił uwagę, że może istnieć niestandardowa implementacja obowiązkowego blokowania plików w jądrze systemu Linux ( patrz ta dyskusja ), w oparciu o historyczne podobieństwa z innych systemów operacyjnych * nix. Wygląda to jednak tylko na interfejs poziomu C.
źródło
flock
każdym razem. bardzo pomocny!Możesz użyć polecenia „sh -c command ...”, aby uruchomić całe polecenie powłoki, w tym przekierowanie pliku, z blokadą. Ponieważ używasz pliku jako licznika, musisz stale blokować blokadę podczas odczytu i zapisu. Więc chciałbyś zrobić coś takiego, aby zwiększyć licznik i zwrócić jego nową wartość:
Zmiana znaku plus na znak minus powinna zmniejszyć licznik:
Oczekuję, że zainicjujesz licznik, zanim zdarzy się jakakolwiek rywalizacja, więc nie musisz się martwić o tak wczesne zablokowanie:
Nie sądzę, żebyś kiedykolwiek musiał blokować wartość licznika, podczas gdy mogłaby wystąpić sprzeczka, ale jeśli kiedykolwiek to zrobiłeś, powinieneś to zrobić w ten sposób:
Myślę, że rozumiesz, jak zrobić czytanie, ale dołączam to dla kompletności:
źródło