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.
Suurepärane! Aitäh jagamast.
Tore artikkel, lihtsalt muutke 'echo "rsync juba töötab: $ (cat $ LCK)"' versiooniks "echo" rsync juba töötab: $ (cat $ LOCK) "'
seoses
Väga huvitav artikkel, jah härra! Seda ma hoian.
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.
Väga huvitav, jah, härra.