Surffaillessani kansallisessa verkossa törmäsin a mielenkiintoinen artikkeli (jonka tuon tänne tekstillisesti, koska se on mestarillisesti selitetty), jossa sen kirjoittaja näyttää meille, kuinka tehdä Bash-skripteistämme vankempia käyttämällä ansoja.
Tee bash-skripteistäsi vankempia ansojen avulla
Kuvittele, että sinulla on bash-komentosarja, joka suoritetaan joka päivä kuuden tunnin välein ja että jossain vaiheessa se kaatuu tai että sama komentosarja suoritetaan kahdesti samanaikaisesti. Nämä kaksi tilannetta ovat melko epämiellyttäviä, koska ne edellyttävät ihmisen toiminnan korjaamista tai tiettyinä aikoina niihin ei voida puuttua, jolloin järjestelmä on epäjohdonmukaisessa tilassa. Ratkaisu tähän on muun muassa ansojen käyttö.
Traps on yksinkertainen ja tehokas tapa hallita bash-komentosarjojen lähtöä. Palataan takaisin samaan lähtötilanteeseen, jos komentosarja pysäytetään manuaalisesti, esimerkiksi ctrl-c, se keskeytetään palauttamaan lähtösignaali
INT
ja jos se päättyy
kill
silloin tuotos olisi
TERM
.
Kaikkia mahdollisia poistumiskoodeja voidaan tarkastella
kill -l
kuitenkin eniten käytetyt ovat tarkalleen
INT, TERM, EXIT
Jos komentosarja koostuu esimerkiksi tiedostojen synkronoinnista
rsync
järkevintä on luottaa lukitustiedostoon, joka ei salli komentosarjan suorittamista samanaikaisesti:
LOCK = "/ var / run / rsync.lock" jos [! -e $ LOCK]; kosketa sitten $ LOCK rsync -avz foo bar rm $ LOCK else echo "rsync on jo käynnissä" fi
Selkeällä espanjan kielellä yllä oleva komentosarja tarkistaa, onko lukitustiedosto olemassa, ja jos sitä ei ole, se luo sen ja suorittaa sitten vastaavan komennon ja lopulta poistaa lukitustiedoston. Jos tiedosto on olemassa, komentosarja lähettää käyttäjälle vain viestin, joka osoittaa, että komento on jo käynnissä.
Ongelmatilanteessa voi kuitenkin tapahtua, että lukitustiedostoa ei poisteta, mikä pilaa ei-toivotut vaikutukset. Ratkaisu on hyvin yksinkertainen:
LOCK = "/ var / run / rsync.lock" jos [! -e $ LOCK]; sitten ansa "rm -f $ LOCK; exit" INT TERM EXIT kosketa $ LOCK rsync -avz foo bar rm $ LOCK trap - INT TERM EXIT else echo "rsync on jo käynnissä" fi
Tämän ratkaisun erityispiirre on, että komento on suljettu ansaan siten, että kun signaali vastaanotetaan
INT, TERM, EXIT
komentosarja pysäyttää ja tyhjentää lukitustiedoston.
On syytä sanoa, että yllä olevassa komentosarjassa saattaa olla kilpailutilanne lukitustiedoston vahvistamisen ja sen luomisen välillä. Yksi mahdollinen ratkaisu olisi käyttää uudelleenohjausta ja bashin noclobber-tilaa, joka ei ohjaa uudelleen olemassa olevaan tiedostoon:
LOCK = "/ var / run / rsync.lock" if (aseta -o noclobber; echo $$> "$ LOCK") 2> / dev / null; sitten ansa 'rm -f "$ LOCK"; poistua $? ' INT TERM EXIT rsync -avz foo bar rm -f $ LOCK trap - INT TERM EXIT else echo "rsync on jo käynnissä: $ (cat $ LCK)" fi
Jälkimmäisen erityispiirre on, että sitä käytetään kuten jo sanoin, noklobberitila ja että lukitustiedosto sisältää käynnissä olevan prosessin PID: n.
On myös syytä mainita, että on olemassa muita ratkaisuja, kuten
flock
o
solo
halusin kuitenkin tässä viestissä jakaa ratkaisut bashin omilla resursseilla. Voit oppia hieman enemmän ansoista tämän avulla erinomainen opas.
Loistava! Kiitos jakamisesta.
Hieno artikkeli, muuta 'echo "rsync on jo käynnissä: $ (cat $ LCK)"' muotoon 'echo "rsync on jo käynnissä: $ (cat $ LOCK)"'
terveiset
Erittäin mielenkiintoinen artikkeli, kyllä sir! Tämän pidän.
Se on erittäin hyödyllinen komento pitää mielessä. Käytin sitä komentosarjassa, jonka julkain viestissä, poistamaan joitain tiedostoja, jotka komentosarja loi pysäytettäessä.
Erittäin mielenkiintoista, kyllä sir.