Pagsakay sa pambansang network ay nakatagpo ako a kagiliw-giliw na artikulo (na dadalhin ko rito nang pasalita sapagkat ito ay mahusay na naipaliwanag) kung saan ipinapakita sa atin ng may-akda nito kung paano gawing mas matatag ang aming mga script sa Bash gamit ang Traps.
Gawing mas matatag ang iyong mga script sa bash sa mga traps
Isipin na mayroon kang isang bash script na tumatakbo araw-araw tuwing anim na oras at na sa isang punto ay nabigo ito o ang parehong script ay tumatakbo nang dalawang beses nang sabay-sabay. Ang dalawang sitwasyong ito ay lubos na hindi komportable dahil nangangailangan sila ng interbensyon ng tao upang maitama o sa ilang mga oras na hindi ito matutugunan, naiwan ang system sa isang hindi pare-parehong estado. Ang solusyon dito, bukod sa iba pa, ay ang paggamit ng mga traps.
Ang mga bitag ay isang simple at mabisang paraan upang makontrol ang output ng bash script. Bumalik tayo sa parehong paunang sitwasyon, kung ang script ay hihinto nang manu-mano, halimbawa sa ctrl-c, nagagambala ito sa pagbabalik ng signal ng output
INT
at kung magtatapos ito sa
kill
pagkatapos ay ang output ay magiging
TERM
.
Ang lahat ng posibleng mga exit code ay maaaring matingnan kasama
kill -l
Gayunpaman, ang pinaka ginagamit ay tiyak
INT, TERM, EXIT
Kung ang script ay binubuo, halimbawa, ng pagsabay sa mga file sa
rsync
ang pinaka-matino na bagay ay umasa sa isang lock file na hindi pinapayagan ang script na tumakbo nang sabay-sabay:
LOCK = "/ var / run / rsync.lock" kung [! -e $ LOCK]; pagkatapos pindutin ang $ LOCK rsync -avz foo bar rm $ LOCK pa ang echo "tumatakbo na ang rsync" fi
Sa simpleng Espanyol, sinusuri ng script sa itaas kung mayroon ang lock file at kung wala ito, nilikha ito at pagkatapos ay isinasagawa ang kaukulang utos, sa wakas ay tinatanggal ang lock file. Kung mayroon ang file, ang script ay nagpapadala lamang ng isang mensahe sa gumagamit na nagpapahiwatig na tumatakbo na ang utos.
Gayunpaman kapag may isang problemadong sitwasyon maaaring mangyari na ang lock file ay hindi tinanggal, sinisira ang mga hindi nais na epekto. Napakadali ng solusyon:
LOCK = "/ var / run / rsync.lock" kung [! -e $ LOCK]; pagkatapos ay bitag ang "rm -f $ LOCK; exit" INT TERM EXIT touch touch $ LOCK rsync -avz foo bar rm $ LOCK trap - INT TERM EXIT ibang echo "tumatakbo na si rsync" fi
Ang pagiging partikular ng solusyon na ito ay ang utos ay nakapaloob sa isang bitag, upang kapag natanggap ang isang senyas
INT, TERM, EXIT
humihinto ang script at nililimas ang lock file.
Ito ay nagkakahalaga ng sinasabi na maaaring mayroong isang sitwasyon ng kumpetisyon sa script sa itaas sa pagitan ng oras na ang file ng lock ay napatunayan at ang oras na ito ay nilikha. Ang isang posibleng solusyon ay ang paggamit ng isang redirect at bash's noclobber mode na hindi nagre-redirect sa isang mayroon nang file:
LOCK = "/ var / run / rsync.lock" kung (set -o noclobber; echo $$> "$ LOCK") 2> / dev / null; pagkatapos ay bitag 'rm -f "$ LOCK"; exit $? ' INT TERM EXIT rsync -avz foo bar rm -f $ LOCK trap - INT TERM EXIT else echo "tumatakbo na ang rsync: $ (cat $ LCK)" fi
Ang kakaibang uri ng huli ay ginagamit ito tulad ng nasabi ko na, ang mode na noclobber at ang lock file ay naglalaman ng PID ng proseso na naisasagawa.
Mahalaga rin na banggitin na mayroong iba pang mga solusyon tulad ng
flock
o
solo
subalit sa post na ito nais kong ibahagi ang mga solusyon sa sariling mga mapagkukunan ng bash. Maaari kang matuto nang kaunti pa tungkol sa Mga Traps kasama nito mahusay na gabay.
Malaki! Salamat sa pagbabahagi.
Magandang artikulo, baguhin lamang ang 'echo "tumatakbo na ang rsync: $ (cat $ LCK)"' sa 'echo "rsync ay tumatakbo na: $ (cat $ LOCK)"'
Regards
Isang napaka-kagiliw-giliw na artikulo, oo ginoo! Itinatago ko ito.
Ito ay isang napaka kapaki-pakinabang na utos na tandaan. Ginamit ko ito sa isang script na nai-publish ko sa isang post, upang matanggal ang ilang mga file na nilikha ng script nang ito ay tumigil.
Napakainteres, oo ginoo.