[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