Zamke: učinite vaše bash skripte robusnijima

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


Ostavite komentar

Vaša e-mail adresa neće biti objavljena. Obavezna polja su označena sa *

*

*

  1. Za podatke odgovoran: Miguel Ángel Gatón
  2. Svrha podataka: Kontrola neželjene pošte, upravljanje komentarima.
  3. Legitimacija: Vaš pristanak
  4. Komunikacija podataka: Podaci se neće dostavljati trećim stranama, osim po zakonskoj obavezi.
  5. Pohrana podataka: Baza podataka koju hostuje Occentus Networks (EU)
  6. Prava: U bilo kojem trenutku možete ograničiti, oporaviti i izbrisati svoje podatke.

  1.   Raphael Castro rekao je

    Super! Hvala na dijeljenju.

  2.   nx rekao je

    Dobar članak, samo promijenite 'echo "rsync već radi: $ (cat $ LCK)"' u 'echo "rsync već radi: $ (cat $ LOCK)"'

    Saludos

  3.   dglangos rekao je

    Vrlo zanimljiv članak, da gospodine! Ovo čuvam.

  4.   Joaquin rekao je

    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.

  5.   DaniFP rekao je

    Vrlo zanimljivo, da gospodine.