Ansa: tee bash-skripteistäsi vankempia

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.


Jätä kommentti

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *

*

*

  1. Vastuussa tiedoista: Miguel Ángel Gatón
  2. Tietojen tarkoitus: Roskapostin hallinta, kommenttien hallinta.
  3. Laillistaminen: Suostumuksesi
  4. Tietojen välittäminen: Tietoja ei luovuteta kolmansille osapuolille muutoin kuin lain nojalla.
  5. Tietojen varastointi: Occentus Networks (EU) isännöi tietokantaa
  6. Oikeudet: Voit milloin tahansa rajoittaa, palauttaa ja poistaa tietojasi.

  1.   Raphael Castro dijo

    Loistava! Kiitos jakamisesta.

  2.   nx dijo

    Hieno artikkeli, muuta 'echo "rsync on jo käynnissä: $ (cat $ LCK)"' muotoon 'echo "rsync on jo käynnissä: $ (cat $ LOCK)"'

    terveiset

  3.   dglangos dijo

    Erittäin mielenkiintoinen artikkeli, kyllä ​​sir! Tämän pidän.

  4.   Joaquin dijo

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

  5.   DaniFP dijo

    Erittäin mielenkiintoista, kyllä ​​sir.