Püünised: muutke oma bash-skriptid kindlamaks

Riiklikus võrgus surfates kohtasin a huvitav artikkel (mille toon siia tekstiliselt, sest see on meisterlikult lahti seletatud), kus selle autor näitab meile, kuidas meie bashi skripte tugevamaks muuta Püünised.

Muutke oma bash-skriptid lõksudega tugevamaks

Kujutage ette, et teil on bashi skript, mis töötab iga päev iga kuue tunni tagant ja et ühel hetkel see ebaõnnestub või sama skript töötab kaks korda korraga. Need kaks olukorda on üsna ebamugavad, kuna nõuavad inimese sekkumise korrigeerimist või teatud aegadel ei saa neid lahendada, jättes süsteemi ebajärjekindlasse olekusse. Selle lahenduseks on muu hulgas püüniste kasutamine.

Püünised on lihtne ja tõhus viis bashi skriptide väljundi juhtimiseks. Läheme tagasi samasse algsituatsiooni, kui skript peatatakse käsitsi, näiteks klahviga Ctrl-c, katkestatakse see väljundsignaali tagastamisega

INT

ja kui see lõpeb

kill

siis oleks väljund

TERM.

Kõiki võimalikke väljumiskoode saab vaadata

kill -l

Kuid kõige sagedamini kasutatakse täpselt

INT, TERM, EXIT

Kui skript koosneb näiteks failide sünkroonimisest rakendusega

rsync

kõige mõistlikum on tugineda lukufailile, mis ei võimalda skripti üheaegset käitamist:

LOCK = "/ var / run / rsync.lock" kui [! -e $ LOCK]; siis puuduta $ LOCK rsync -avz foo bar rm $ LOCK else kaja "rsync töötab juba" fi

Tavalises hispaania keeles kontrollib ülaltoodud skript, kas lukufail on olemas, ja kui seda pole, loob see selle ja täidab hiljem vastava käsu, kustutades lõpuks lukufaili. Kui fail on olemas, saadab skript kasutajale lihtsalt sõnumi, mis näitab, et käsk juba töötab.

Probleemses olukorras võib juhtuda, et lukufaili ei kõrvaldata, rikkudes soovimatuid efekte. Lahendus on väga lihtne:

LOCK = "/ var / run / rsync.lock" kui [! -e $ LOCK]; siis lõksu "rm -f $ LOCK; exit" INT TERM EXIT puuduta $ LOCK rsync -avz foo bar rm $ LOCK trap - INT TERM EXIT muu kaja "rsync juba töötab" fi

Selle lahenduse eripära on see, et käsk on suletud lõksu, nii et signaali vastuvõtmisel

INT, TERM, EXIT

skript peatub ja kustutab lukufaili.

Tasub öelda, et ülaltoodud skriptis võib lukufaili kontrollimise ja selle loomise aja vahel olla konkurentsiolukord. Üheks võimalikuks lahenduseks oleks kasutada ümbersuunamise ja bashi noclobber-režiimi, mis ei suunaks olemasolevale failile ümber:

LOCK = "/ var / run / rsync.lock" if (määra -o noklobber; echo $$> "$ LOCK") 2> / dev / null; siis lõksu 'rm -f "$ LOCK"; väljuda $? ' INT TERM EXIT rsync -avz foo bar rm -f $ LOCK trap - INT TERM EXIT else echo "rsync juba töötab: $ (kass $ LCK)" fi

Viimase eripära on see, et seda kasutatakse, nagu ma juba ütlesin, noklobberi režiimi ja lukustusfail sisaldab käivitatava protsessi PID-d.

Samuti väärib mainimist, et on ka muid lahendusi nagu

flock

o

solo

aga selles postituses tahtsin lahendusi jagada Bashi omavahenditega. Selle abil saate lõksude kohta veidi rohkem teada suurepärane juhend.


Jäta oma kommentaar

Sinu e-postiaadressi ei avaldata. Kohustuslikud väljad on tähistatud *

*

*

  1. Andmete eest vastutab: Miguel Ángel Gatón
  2. Andmete eesmärk: Rämpsposti kontrollimine, kommentaaride haldamine.
  3. Seadustamine: teie nõusolek
  4. Andmete edastamine: andmeid ei edastata kolmandatele isikutele, välja arvatud juriidilise kohustuse alusel.
  5. Andmete salvestamine: andmebaas, mida haldab Occentus Networks (EL)
  6. Õigused: igal ajal saate oma teavet piirata, taastada ja kustutada.

  1.   Raphael Castro DIJO

    Suurepärane! Aitäh jagamast.

  2.   nx DIJO

    Tore artikkel, lihtsalt muutke 'echo "rsync juba töötab: $ (cat $ LCK)"' versiooniks "echo" rsync juba töötab: $ (cat $ LOCK) "'

    seoses

  3.   dglangos DIJO

    Väga huvitav artikkel, jah härra! Seda ma hoian.

  4.   Joaquin DIJO

    See on väga kasulik käsk, mida meeles pidada. Kasutasin seda skriptis, mille avaldasin postituses, et kustutada mõned failid, mis skript lõi selle loomisel.

  5.   DaniFP DIJO

    Väga huvitav, jah, härra.