flockjest 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 na setlockużyteczności Daniela J. Bernsteina z jego pakietu daemontools:
Narzędzia te działają z nieco innym paradygmatem niż ten zastosowany w odpowiedzi M. Kurenkowa (taki, który flockmoże również zastosować, ale nie ma w tej odpowiedzi). Wywołuje się setlockprogram, aby powiązać obciążenie z poleceniem, które musi być zablokowane. setlocksam 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 wbudowanego echopolecenia powłoki :
echo pliku blokującego setlock „$ RESULT” >> ./$TEMP_DIR/$OUT_FILE
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 fdredir/ redirfd:
setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" echo "$ RESULT"
który można zmienić w funkcję powłoki, jeśli chce się:
outfile () {setlock mylockfile fdredir --append 1 "./$TEMP_DIR/$OUT_FILE" "$ @"; }
[…]
Echo wyjściowe „$ RESULT”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:
setlock mylockfile sh -c 'echo' "$ RESULT" '>> "./'$TEMP_DIR'/'$OUT_FILE'"
To oczywiście uogólnia na rzeczy inne niż pisanie do plików wyjściowych:
setlock mylockfile sh -c '… zablokowane; rzeczy…
`pwd`; możesz po prostu użyć kropki (.). Powinieneś także zacytować całą nazwę pliku, ponieważ zawiera on zmienne .