Po przejrzeniu dokumentacji bash , to pytanie i to wciąż nie jest dla mnie jasne, w jaki sposób mogę wykonać operacje zapisu atomowego (dołączyć) do pliku w bash. Mam skrypt uruchamiany w wielu instancjach, który w pewnym momencie musi zapisać dane do pliku:
echo "$RESULT" >> `pwd`/$TEMP_DIR/$OUT_FILE
Jak to możliwe, aby wszystkie operacje zapisu ze wszystkich jednocześnie działających skryptów do tego pliku były atomowe (aby dane z jednej instancji nie nakładały się na dane z innej)?
linux
bash
command-line
semaphore
Sebi
źródło
źródło
`pwd`
; możesz po prostu użyć kropki (.
). Powinieneś także zacytować całą nazwę pliku, ponieważ zawiera on zmienne .pwd
wcześniej w skrypcie, aby powiadomić użytkownika o bieżącym katalogu roboczym, a także zapisywać wpisy w pliku dziennika. patrząc teraz na FIFO.mkfifo
i nie jest dokładnie poziomem wprowadzającym.Odpowiedzi:
Wydaje się, że musisz użyć
flock
jak w przykładzie z man ( http://linux.die.net/man/1/flock )I umieść wszystkie swoje polecenia, które muszą być atomowe w ().
źródło
/var/lock/mylockfile
będzie dostępna blokada./var/lock/mylockfile
w procesie, który zadzwoniłflock -x
?(flock -x 200; date; sleep 10; date;) 200>/var/lock/mylockfile
w dwóch powłokach i zobaczyć, że odblokowanie nastąpi dopiero po wykonaniu wszystkich poleceń in () (czyli w podpowłoce)flock
jest jednym ze sposobów blokowania operacji. Narzędzie to jest częścią zestawu narzędzi util-linux i jest dostępne tylko dla systemu Linux. Inne narzędzia, dostępne na szerokiej gamie platform, są oparte nasetlock
użyteczności Daniela J. Bernsteina z jego pakietu daemontools:setlock
z daemontoolssetlock
z daemontools-encore Bruce'a Guenteras6-setlock
z s6 Laurenta Bercottachpst
z runitu Gerrita Pape'arunlock
od sprawcy Wayne'a Marshallasetlock
z mojego zestawu narzędzi noshNarzędzia te działają z nieco innym paradygmatem niż ten zastosowany w odpowiedzi M. Kurenkowa (taki, który
flock
może również zastosować, ale nie ma w tej odpowiedzi). Wywołuje sięsetlock
program, aby powiązać obciążenie z poleceniem, które musi być zablokowane.setlock
sam się otwiera i blokuje plik blokady i pozostawia deskryptor pliku dla niego otwarty w trakcie procesu. Blokada trwa tak długo, jak trwa ten proces (chyba że kolejne polecenie powiązane w celu jawnego zwolnienia blokady przez znalezienie i zamknięcie deskryptora otwartego pliku).W tym przypadku należy zablokować polecenie, które tworzy linię wyjściową, mając świadomość, że wywołuje to polecenie zewnętrzne
echo
zamiast wbudowanegoecho
polecenia powłoki :W takim przypadku nie jest konieczne blokowanie otwierania pliku wyjściowego w trybie dołączania. Gdyby tak było, należałoby otworzyć ten plik w zamku, co wymaga użycia programów takich jak
który można zmienić w funkcję powłoki, jeśli chce się: lub trzymanie się składni powłoki i interpretowanie jej przez drugą powłokę działającą pod blokadą, wymagającą nietrywialnego cytowania, jeśli zmienne powłoki nie są eksportowane jako zmienne środowiskowe:fdredir
/redirfd
:To oczywiście uogólnia na rzeczy inne niż pisanie do plików wyjściowych:
źródło