Feller: Gjør bash-skriptene dine mer robuste

Surfing det nasjonale nettverket jeg kom over en interessant artikkel (som jeg tar med her tekstlig fordi det er mesterlig forklart) hvor forfatteren viser oss hvordan vi kan gjøre Bash-skriptene våre mer robuste ved hjelp av Feller.

Gjør bash-skriptene dine mer robuste med feller

Tenk deg at du har et bash-skript som kjører hver dag hver sjette time, og at det på et tidspunkt krasjer, eller at det samme skriptet kjører to ganger samtidig. Disse to situasjonene er ganske ubehagelige siden de krever at menneskelig inngripen korrigeres, eller på bestemte tidspunkter ikke kan adresseres, og etterlater systemet i en inkonsekvent tilstand. Løsningen på dette er blant annet å bruke feller.

Feller er en enkel og effektiv måte å kontrollere utdataene fra bash-skript. La oss gå tilbake til samme utgangssituasjon, hvis skriptet stoppes manuelt, for eksempel med ctrl-c, blir det avbrutt og returnerer utgangssignalet

INT

og hvis det ender med

kill

da ville produksjonen være

TERM.

Alle mulige utgangskoder kan vises med

kill -l

men de mest brukte er nøyaktig

INT, TERM, EXIT

Hvis skriptet for eksempel består av filsynkronisering med

rsync

det mest fornuftige er å stole på en låsefil som ikke lar skriptet kjøre samtidig:

LOCK = "/ var / run / rsync.lock" hvis [! -e $ LOCK]; trykk deretter på $ LOCK rsync -avz foo bar rm $ LOCK annet ekko "rsync kjører allerede" fi

På vanlig spansk sjekker skriptet ovenfor om låsefilen eksisterer, og hvis den ikke eksisterer, oppretter den den og utfører deretter den tilsvarende kommandoen, og til slutt slettes låsefilen. Hvis filen eksisterer, sender skriptet bare en melding til brukeren som indikerer at kommandoen allerede kjører.

Imidlertid, når det er en problematisk situasjon, kan det skje at låsefilen ikke elimineres, og ødelegger uønskede effekter. Løsningen er veldig enkel:

LOCK = "/ var / run / rsync.lock" hvis [! -e $ LOCK]; deretter fange "rm -f $ LOCK; avslutt" INT TERM EXIT touch $ LOCK rsync -avz foo bar rm $ LOCK trap - INT TERM EXIT ellers ekko "rsync kjører allerede" fi

Det spesielle ved denne løsningen er at kommandoen er lukket i en felle, slik at når et signal mottas

INT, TERM, EXIT

skriptet stopper og tømmer låsefilen.

Det er verdt å si at det kan være en konkurransesituasjon i skriptet ovenfor mellom den tiden låsefilen blir bekreftet og tidspunktet den opprettes. En mulig løsning ville være å bruke en omdirigering og bashs noclobber-modus som ikke omdirigerer til en eksisterende fil:

LOCK = "/ var / run / rsync.lock" if (set -o noclobber; echo $$> "$ LOCK") 2> / dev / null; deretter fange 'rm -f "$ LOCK"; gå ut av $? ' INT TERM EXIT rsync -avz foo bar rm -f $ LOCK trap - INT TERM EXIT ellers ekko "rsync kjører allerede: $ (cat $ LCK)" fi

Det særegenheten ved sistnevnte er at den brukes som jeg allerede hadde sagt, noclobber-modusen og at låsefilen inneholder PID for prosessen som blir utført.

Det er også verdt å nevne at det finnes andre løsninger som f.eks

flock

o

solo

men i dette innlegget ønsket jeg å dele løsningene med bashs egne ressurser. Du kan lære litt mer om feller med dette utmerket guide.


Legg igjen kommentaren

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Kontroller SPAM, kommentaradministrasjon.
  3. Legitimering: Ditt samtykke
  4. Kommunikasjon av dataene: Dataene vil ikke bli kommunisert til tredjeparter bortsett fra ved juridisk forpliktelse.
  5. Datalagring: Database vert for Occentus Networks (EU)
  6. Rettigheter: Når som helst kan du begrense, gjenopprette og slette informasjonen din.

  1.   Raphael Castro sa

    Flott! Takk for at du delte.

  2.   nx sa

    Fin artikkel, bare endre 'echo "rsync kjører allerede: $ (cat $ LCK)"' til 'echo "rsync kjører allerede: $ (cat $ LOCK)"'

    Hilsen

  3.   dglangos sa

    En veldig interessant artikkel, ja sir! Dette holder jeg.

  4.   Joaquin sa

    Det er en veldig nyttig kommando å huske på. Jeg brukte den i et skript som jeg publiserte i et innlegg, for å slette noen filer som skriptet opprettet da det ble stoppet.

  5.   DaniFP sa

    Veldig interessant, ja sir.