flock - gestionează blocările din scripturi
shell
flock [opțiuni] fișier|director
comanda [argumente]
flock [opțiuni] fișier|director
-c comanda
flock [opțiuni] număr
Această utilitate gestionează blocările
flock(2) din cadrul scripturilor de tip shell sau din linia de
comandă.
Prima și a doua dintre formele de mai sus
învăluie blocarea în jurul executării unei
comenzi, într-un mod similar cu su(1) sau
newgrp(1). Acestea blochează un fișier sau un
director specificat, care este creat (presupunând permisiunile
corespunzătoare) dacă nu există deja. În mod
implicit, în cazul în care blocarea nu poate fi
obținută imediat, flock așteaptă
până când blocarea este disponibilă.
Cea de-a treia formă utilizează un fișier
deschis prin descriptorul de fișier număr. A se vedea
exemplele de mai jos pentru a afla cum poate fi utilizat.
-c, --command comanda
Pasează o singură comandă,
fără argumente, către shell cu -c.
-E, --conflict-exit-code număr
Starea de ieșire utilizată atunci
când se utilizează opțiunea -n și
există o blocare conflictuală sau când se
utilizează opțiunea -w și se
depășește timpul de așteptare. Valoarea
implicită este 1. numărul trebuie să fie
cuprins între 0 și 255.
-F, --no-fork
Nu creează o bifurcație înainte de a
executa comanda. După execuție, procesul flock este
înlocuit de comandă, care continuă să
dețină blocarea. Această opțiune este
incompatibilă cu opțiunea --close, deoarece altfel nu ar
mai rămâne nimic care să păstreze blocajul.
-e, -x, --exclusive
Obține o blocare exclusivă, denumită
uneori blocare la scriere. Aceasta este opțiunea
implicită.
-n, --nb, --nonblock
Eșuează în loc să
aștepte, dacă nu se poate obține imediat blocarea. A se
vedea opțiunea -E pentru starea de ieșire
utilizată.
-o, --close
Închide descriptorul de fișier în
care este deținut blocajul înainte de a executa comanda.
Acest lucru este util în cazul în care comanda
generează un proces-copil care nu ar trebui să
dețină blocarea.
-s, --shared
Obține o blocare partajată, denumită
uneori blocare la citire.
-u, --unlock
Înlătură o blocare. De obicei, acest
lucru nu este necesar, deoarece o blocare este eliminată automat atunci
când fișierul este închis. Cu toate acestea, poate fi
necesară în cazuri speciale, de exemplu, dacă grupul de
comenzi închis a bifurcat un proces în fundal care nu ar trebui
să dețină blocarea.
-w, --wait, --timeout secunde
Eșuează dacă blocarea nu poate fi
obținută în secunde. Sunt permise valorile
fracționare zecimale. A se vedea opțiunea -E pentru
starea de ieșire utilizată. Numărul zero de
secunde este interpretat ca fiind --nonblock.
--fcntl
În loc de
flock(2), aplică o blocare a
descrierii fișierului deschis
fcntl(2) (adică, utilizând
comenzile F_OFD_SETLK (neblocare) sau F_OFD_SETLKW (blocare)). Aceste blocaje
sunt independente de cele aplicate prin
flock(2), dar, spre deosebire de
blocajele tradiționale POSIX fcntl() (F_SETLK, F_SETLKW), au o
semantică care corespunde celei a
flock(2).
Aceasta este disponibilă numai pe versiunile de nucleu
>= 3.15.
--verbose
Raportează cât timp a durat
obținerea blocării sau de ce nu a putut fi
obținută.
-h, --help
Afișează acest mesaj de ajutor și
iese.
-V, --version
Afișează versiunea și iese.
Comanda utilizează valorile de stare de ieșire
<sysexits.h> pentru orice lucru, cu excepția cazului în
care se utilizează oricare dintre opțiunile -n sau
-w, care raportează un eșec de achiziționare a
blocării cu o stare de ieșire dată de opțiunea
-E sau 1 în mod implicit. Starea de ieșire dată
de -E trebuie să fie cuprinsă între 0 și
255.
Atunci când se utilizează varianta comanda
și se execută comanda-copil, atunci starea de ieșire
este cea a comenzii-copil.
flock nu detectează blocajul blocării
(deadlock). A se vedea flock(2) pentru detalii.
Unele sisteme de fișiere (de exemplu, NFS și CIFS)
au o implementare limitată a flock(2) și este posibil
ca «flock» să eșueze întotdeauna. Pentru
detalii, consultați flock(2), nfs(5) și
mount.cifs(8). În funcție de opțiunile de
montare, «flock» poate eșua întotdeauna
acolo.
Rețineți că „shell> ” din
exemple este un prompt de linie de comandă.
shell1> flock /tmp -c cat; shell2> flock -w .007 /tmp -c
echo; /bin/echo $?
Stabilește o blocare exclusivă a
directorului /tmp și a doua comandă va eșua.
shell1> flock -s /tmp -c cat; shell2> flock -s -w .007 /tmp
-c echo; /bin/echo $?
Stabilește blocarea partajată la directorul
/tmp și a doua comandă nu va eșua.
Observați că încercarea de a obține o blocare
exclusivă cu a doua comandă ar eșua.
shell> flock -x fișier-blocare-locală echo 'a b
c'
Preia blocarea exclusivă
„fișier-blocare-locală” înainte de a rula
echo cu „a b c”.
(; flock -n 9 || exit 1; # ... comenzi executate sub blocare ...;
) 9>/var/lock/fișierul-meu-de-blocare
Formatul este convenabil în cadrul scripturilor
shell. Modul utilizat pentru a deschide fișierul nu contează
pentru flock; utilizarea > sau >> permite
crearea fișierului de blocare dacă acesta nu există deja,
însă este necesară permisiunea de scriere. Utilizarea
< presupune ca fișierul să existe deja, dar este
necesară doar permisiunea de citire.
[ "${FLOCKER}" != "$0" ] && exec env
FLOCKER="$0" flock -en "$0" "$0"
"$@" || :
Acesta este un cod auxiliar util pentru scripturile
shell. Puneți-l în partea de sus a scriptului shell pe care
doriți să îl blocați și se va bloca automat
la prima execuție. Dacă variabila de mediu $FLOCKER nu
este definită la scriptul de shell care este rulat, atunci
execută flock și obține o blocare exclusivă
fără blocare (folosind scriptul însuși ca
fișier de blocare) înainte de a se reexecuta cu argumentele
corecte. De asemenea, stabilește variabila de mediu FLOCKER la
valoarea corectă, astfel încât să nu se mai
execute din nou.
shell> exec 4<>/var/lock/fișierul-meu-de-blocare;
shell> flock -n 4
Această formă este convenabilă
pentru a bloca un fișier fără a genera un subproces.
Shell-ul deschide fișierul de blocare pentru citire și scriere
ca descriptor de fișier 4, apoi se utilizează flock
pentru a bloca descriptorul.
H. Peter Anvin <hpa@zytor.com>
Drepturi de autor © 2003-2006 H. Peter Anvin. Acesta este
un software liber; consultați sursa pentru condițiile de
copiere. Nu există nicio garanție; nici măcar pentru
COMERCIALIZARE sau ADECVARE LA UN SCOP PARTICULAR.
Pentru rapoarte de eroare, folosiți sistemul de
urmărire al erorilor
<https://github.com/util-linux/util-linux/issues>.
Comanda flock face parte din pachetul util-linux care poate
fi descărcat de la Linux Kernel Archive
<https://www.kernel.org/pub/linux/utils/util-linux/>.