Mga bitag: gawing mas matatag ang iyong mga script sa bash

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.


Iwanan ang iyong puna

Ang iyong email address ay hindi nai-publish. Mga kinakailangang patlang ay minarkahan ng *

*

*

  1. Responsable para sa data: Miguel Ángel Gatón
  2. Layunin ng data: Kontrolin ang SPAM, pamamahala ng komento.
  3. Legitimation: Ang iyong pahintulot
  4. Komunikasyon ng data: Ang data ay hindi maiparating sa mga third party maliban sa ligal na obligasyon.
  5. Imbakan ng data: Ang database na naka-host ng Occentus Networks (EU)
  6. Mga Karapatan: Sa anumang oras maaari mong limitahan, mabawi at tanggalin ang iyong impormasyon.

  1.   Raphael Castro dijo

    Malaki! Salamat sa pagbabahagi.

  2.   nx dijo

    Magandang artikulo, baguhin lamang ang 'echo "tumatakbo na ang rsync: $ (cat $ LCK)"' sa 'echo "rsync ay tumatakbo na: $ (cat $ LOCK)"'

    Regards

  3.   dglangos dijo

    Isang napaka-kagiliw-giliw na artikulo, oo ginoo! Itinatago ko ito.

  4.   Joaquin dijo

    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.

  5.   DaniFP dijo

    Napakainteres, oo ginoo.