FLOCK(1)

NUME
flock - gestionează blocările din scripturi shell

REZUMAT

flock [opțiuni] fișier|director comanda [argumente]

flock [opțiuni] fișier|director -c comanda

flock [opțiuni] număr

DESCRIERE

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.

OPȚIUNI

-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, --nonblocking
    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(2) (F_SETLK, F_SETLKW), au o semantică care corespunde celei a flock(2).

    Aceasta este disponibilă numai pe versiunile de nucleu >= 3.15.

--start poziția
    Poziția inițială pentru blocare. Această opțiune implică --fcntl.

--length număr
    Numărul de octeți de blocat. Această opțiune implică --fcntl.

--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.

STARE DE IEȘIRE

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.

NOTE

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.

EXEMPLE

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.

AUTORI

DREPTURI DE AUTOR

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.

CONSULTAȚI ȘI

flock(2), fcntl(2)

RAPORTAREA ERORILOR

Pentru rapoarte de eroare, folosiți

DISPONIBILITATE

Comanda flock face parte din pachetul util-linux care poate fi descărcat de la