Surfajući po nacionalnoj mreži naišao sam na a zanimljiv članak (što ovdje donosim tekstualno jer je majstorski objašnjeno) gdje nam njegov autor pokazuje kako naše Bash skripte učiniti robusnijim koristeći zamke.
Učinite vaše bash skripte robusnijima pomoću zamki
Zamislite da imate bash skriptu koja se izvodi svaki dan svakih šest sati i da se u nekom trenutku sruši ili se ista skripta izvodi dva puta istovremeno. Ove dvije situacije su prilično neugodne, jer zahtijevaju ispravljanje ljudske intervencije ili se u određenim trenucima ne mogu riješiti, ostavljajući sistem u nedosljednom stanju. Rješenje za to je, između ostalog, korištenje zamki.
Zamke su jednostavan i učinkovit način za kontrolu izlaza bash skripti. Vratimo se na istu početnu situaciju, ako se skripta zaustavi ručno, na primjer s ctrl-c, ona se prekida u povratku izlaznog signala
INT
i ako se završi sa
kill
tada bi izlaz bio
TERM
.
Svi mogući kodovi izlaza mogu se pregledati pomoću
kill -l
Međutim, najčešće se koriste upravo
INT, POJAM, IZLAZ
Ako se skripta sastoji, na primjer, od sinhronizacije datoteka sa
rsync
najrazumnije je oslanjati se na datoteku zaključavanja koja ne dozvoljava skripti da se istovremeno pokreće:
LOCK = "/ var / run / rsync.lock" ako [! -e $ LOCK]; zatim dodirnite $ LOCK rsync -avz foo bar rm $ LOCK inače eho "rsync već radi" fi
Na običnom španjolskom, gornja skripta provjerava postoji li datoteka zaključavanja i ako ona ne postoji, kreira je, a zatim izvršava odgovarajuću naredbu, konačno brišući datoteku zaključavanja. Ako datoteka postoji, skripta jednostavno šalje poruku korisniku u kojoj se navodi da je naredba već pokrenuta.
Međutim, kada postoji problematična situacija, moglo bi se dogoditi da datoteka zaključavanja ne bude eliminirana, uništavajući neželjene efekte. Rješenje je vrlo jednostavno:
LOCK = "/ var / run / rsync.lock" ako [! -e $ LOCK]; zatim zarobite "rm -f $ LOCK; izađite" INT TERM EXIT dodirnite $ LOCK rsync -avz foo bar rm $ LOCK trap - INT TERM EXIT inače eho "rsync već radi"
Posebnost ovog rješenja je da je naredba zatvorena u zamku, tako da kada se primi signal
INT, POJAM, IZLAZ
skripta se zaustavlja i briše datoteku zaključavanja.
Vrijedno je reći da bi u gornjoj skripti mogla postojati situacija konkurencije između vremena kada se datoteka zaključavanja provjeri i vremena njenog kreiranja. Jedno od mogućih rješenja bilo bi korištenje preusmjeravanja i bashovog načina noclobber koji ne preusmjerava na postojeću datoteku:
LOCK = "/ var / run / rsync.lock" if (set -o noclobber; echo $$> "$ LOCK") 2> / dev / null; zatim zarobite 'rm -f "$ LOCK"; izaći $? ' INT TERM EXIT rsync -avz foo bar rm -f $ LOCK trap - INT TERM EXIT else echo "rsync je već pokrenut: $ (cat $ LCK)" fi
Posebnost potonjeg je u tome što se koristi, kao što sam već rekao, način noclobber i što datoteka zaključavanja sadrži PID procesa koji se izvršava.
Također je vrijedno spomenuti da postoje i druga rješenja kao što su
flock
o
solo
međutim u ovom postu htio sam podijeliti rješenja s vlastitim resursima basha. Ovim možete naučiti malo više o Zamkama odličan vodič.
Super! Hvala na dijeljenju.
Dobar članak, samo promijenite 'echo "rsync već radi: $ (cat $ LCK)"' u 'echo "rsync već radi: $ (cat $ LOCK)"'
Saludos
Vrlo zanimljiv članak, da gospodine! Ovo čuvam.
To je vrlo korisna naredba koju treba imati na umu. Koristio sam ga u skripti koju sam objavio u postu da bih izbrisao neke datoteke koje je skripta stvorila kad je zaustavljena.
Vrlo zanimljivo, da gospodine.