Bash Pagina 109
Crearea unui fișier de blocare de bază
Un fișier de blocare de bază este creat pentru a preveni rularea simultană a mai multor instanțe ale unui script. Existența fișierului de blocare servește drept semnal pentru alte instanțe ale scriptului să nu ruleze. La ieșire, scriptul șterge fișierul de blocare, permițând astfel unei noi instanțe să verifice dacă este sigur de executat.
Cod Exemplu
#!/bin/bash # Verifică dacă fișierul de blocare există; dacă nu, îl creează și setează capcana pentru ștergere la ieșire. if { set -C; 2>/dev/null >~/manlocktest.lock; }; then # Setează capcana pentru a șterge fișierul de blocare la ieșirea din script trap "rm -f ~/manlocktest.lock" EXIT # Scenariul principal începe aici echo "Sunt un scenariu și fac ceva, orice." sleep 30 else echo "Fișier de blocare există... ieșire" exit 1 fi
Explicație
Verificarea fișierului de blocare: Secvența set -C; 2>/dev/null >~/manlocktest.lock
încearcă să creeze fișierul de blocare. Dacă fișierul există deja, operația eșuează, și astfel scriptul sare la secțiunea else, unde oprește execuția.
Capcana (trap): Linia trap "rm -f ~/manlocktest.lock" EXIT
setează o capcană pentru a șterge fișierul de blocare când scriptul se încheie, asigurând astfel că fișierul este eliminat chiar dacă scriptul se termină prematur.
Funcționarea scenariului principal: După ce a creat cu succes fișierul de blocare, scriptul afișează un mesaj și rulează instrucțiuni suplimentare (în acest caz, un somn de 30 de secunde).
Mai clar...
Opțiunea set -C (sau set -o noclobber) previne suprascrierea unui fișier existent atunci când redirecționezi ieșirea către acel fișier. În contextul scripturilor care folosesc fișiere de blocare, aceasta este utilă pentru a verifica dacă fișierul de blocare există deja și, dacă există, să nu fie suprascris.
Astfel, set -C permite ca linia:
set -C; 2>/dev/null >~/manlocktest.lock
să creeze fișierul doar dacă acesta nu există. Dacă fișierul de blocare ~/manlocktest.lock există deja, comanda va eșua, iar fișierul nu va fi suprascris. Aceasta semnalează scriptului că o altă instanță este deja în execuție, permițându-i să oprească rularea dacă detectează fișierul existent. Codul 2>/dev/null
previne afișarea mesajului de eroare că fișierul există deja.
Observații
Acest tip de blocare simplă este foarte util pentru a evita conflictele în rularea scripturilor și asigură că doar o instanță a scriptului poate rula la un moment dat.
Acest cod oferă o structură clară pentru crearea unui fișier de blocare și ștergerea lui automată la ieșirea din script, prevenind astfel execuția paralelă nedorită.