[OT] Wzajemne wykluczanie procesów na poziomie shella - jak najlepiej?
Łukasz Maśko
masko w ipipan.waw.pl
Czw, 21 Lis 2013, 11:50:45 CET
Trochę OT, ale chciałbym skonsultować takie zagadnienie. Chcę zapewnić
wzajemne wykluczanie w dostępie do pewnych czynności/zasobów dla skryptów. Na
poziomie języka C można to zrealizować np. przez semafory, tworzenie plików
itp. Jest to łatwe (o ile ktoś uważa API semaforów za proste). A ja chciałbym
to samo zrobić na poziomie skryptów shelowych. Nie mam tutaj pamięci
dzielonej, semaforów też nie. Ale mam pliki. Wymyśliłem, że mogę to
zrealizować tak, że będę miał plik, do którego proces będzie wpisywał swoje
ID, o ile plik jest pusty (analogia do opuszczenia semafora). Jeśli w pliku
jest ID danego procesu, to znaczy, że może on wykonywać sekcję krytyczną.
Jeśli natomiast nie - to nie. Podniesienie semafora jest tożsame ze
skasowaniem zawartości pliku. Moja realizacja:
Opuszczenie "semafora":
flock -e file -c "if [ ! -s file ]; then echo $$ > file ; fi"
czyli zakładam lock "wyłącznościowy" na plik i jeśli jest on pusty, to
wpisuję do niego swoje ID.
Wejście do sekcji krytycznej:
if grep -q -e "^$$$" file; then
#tu jest sekcja krytyczna
fi
czyli sprawdzam, czy plik zawiera mój identyfikator i jeśli tak, to wchodzę
Podniesienie semafora:
flock -e file -c "cat /dev/null > file"
czyli skasowanie zawartości pliku.
Co o tym sądzicie? I - najważniejsze - może ktoś ma lepszy pomysł na
realizację powyższego?
--
Łukasz Maśko _o)
Lukasz.Masko(at)ipipan.waw.pl /\\
Registered Linux User #61028 _\_V
Ubuntu: staroafrykańskie słowo oznaczające "Nie umiem zainstalować Debiana"
Więcej informacji o liście pld-users-pl