Ukuwa Phansi Imbobo Yogwaja: Indaba yephutha elilodwa lokuqalisa kabusha ivanishi - Ingxenye 1

Ghostinushanka, ngemva kokuchofa izinkinobho zemizuzu engu-20 yangaphambili njengokungathi ukuphila kwakhe kuncike kukho, uphendukela kimi ngenkulumo engabonakali emehlweni akhe kanye ne-grin enobuqili - "Dude, ngicabanga ukuthi ngiyaqonda."

“Bheka lapha,” esho, ekhomba olunye lwezimpawu esikrinini, “Ngikubheja ngesigqoko sami esibomvu, uma sengeza lokhu engiqeda kukuthumelela kona lapha,” ekhomba enye ingxenye yekhodi, “iphutha ngeke lisaboniswa.”

Ngididekile futhi ngikhathele, ngishintsha isitatimende se-sed ebesisebenza kuso isikhashana, ngigcine ifayela, bese ngigijima systemctl varnish reload. Umlayezo wephutha unyamalele...

“Ama-imeyili engashintshana ngawo nomuntu ozobhapathizwa,” kuqhuba uzakwethu, njengoba ehleka kancane emamatheka egcwele injabulo, “Kwavele kwafika kimina ukuthi lena inkinga efanayo ncamashi!”

Kwaqala kanjani konke

I-athikili ithatha ukuqonda kokuthi i-bash, i-awk, i-sed ne-systemd isebenza kanjani. Ulwazi lwe-varnish luyathandwa kodwa aludingeki.
Izitembu zesikhathi kumazwibela zishintshiwe.
Ibhalwe nge Ghostinushanka.
Lo mbhalo uyinguqulo yokuqala eyashicilelwa ngesiNgisi emasontweni amabili edlule; ukuhumusha boyikoden.

Ilanga likhanya ngamafasitela e-panoramic ngokunye okufudumele kwekwindla ekuseni, inkomishi yesiphuzo esisanda kugaywa i-caffeinated ihlezi eceleni kwekhibhodi, i-symphony eyintandokazi yemisindo idlala kuma-headphone phezu kwe-rustle yamakhibhodi asebenza ngomshini, kanye nokungena kokuqala uhlu lwamathikithi asalela emuva ebhodini le-kanban likhanya ngokudlalayo elinesihloko esiyingozi esithi “Phenya ukulayishwa kabusha kwe-varnish sh: echo: I/O iphutha esiteji” (Phenya “i-varnishreload sh: echo: iphutha le-I/O” esiteji). Uma kuziwa ku-varnish, akukho futhi angeke kube namaphutha, ngisho noma engabangeli izinkinga, njengalokhu.

Kulabo abangazijwayele ukulayishwa kabusha kwe-varnish, lesi iskripthi segobolondo esilula esisetshenziselwa ukulayisha kabusha ukucushwa ukuvenisha - ebizwa nangokuthi i-VCL.

Njengoba isihloko sethikithi sibonisa, iphutha lenzeke kwenye yeziphakeli esiteji, futhi njengoba ngangiqiniseka ukuthi umzila we-varnish esiteji wawusebenza kahle, ngacabanga ukuthi lokhu kungaba iphutha elincane. Ngakho-ke, umlayezo nje ongene emfudlaneni ophumayo osuvele uvaliwe. Ngizithathela ithikithi, ngokuzethemba okuphelele ukuthi ngizomaka ukuthi selilungile kungakapheli imizuzu engama-30, ngizibambe ehlombe ukuze ngikhiphe udoti olandelayo bese ngibuyela ezintweni ezibaluleke kakhulu.

Ukuphahlazeka odongeni ngesivinini esingu-200 km/h

Ivula ifayela varnishreload, kwenye yamaseva asebenzisa i-Debian Stretch, ngibone iskripthi segobolondo esingaphansi kwemigqa engama-200 ubude.

Ngigijima kuskripthi, angizange ngibone noma yini engabangela izinkinga uma ngiyisebenzisa izikhathi eziningi ngokuqondile ukusuka kutheminali.

Phela lesi yisiteji, noma siphuka, akekho ozokhononda, kahle ... hhayi kakhulu. Ngisebenzisa iskripthi futhi ngibone ukuthi yini ezobhalwa kutheminali, kodwa amaphutha awasabonakali.

Okunye okumbalwa kuyagijima ukuze ngiqinisekise ukuthi angikwazi ukuphinda ngikhiqize iphutha ngaphandle komzamo owengeziwe, futhi ngiqala ukuthola ukuthi ngingasishintsha kanjani lesi skripthi futhi ngisenze siqhubeke siphonsa iphutha.

Ingabe umbhalo ungavimba i-STDOUT (usebenzisa > &-)? Noma STDERR? Akuzange kusebenze ekugcineni.

Ngokusobala i-systemd ishintsha indawo yokugijima ngandlela thile, kodwa kanjani, futhi ngani?
Ngivula i-vim futhi ngihlele varnishreload, enezela set -x ngaphansi kwe-shebang, ngethemba lokuthi ukulungisa iphutha kokuphuma kweskripthi kuzosikhanyisela.

Ifayela lilungisiwe, ngakho-ke ngilayisha kabusha i-varnish futhi ngibone ukuthi ushintsho luphule ngokuphelele yonke into ... I-exhaust iyinhlamba ephelele, enamathani ekhodi efana ne-C kuwo. Ngisho nokuskrola kutheminali akwanele ukuthola ukuthi iqala kuphi. Ngididekile ngokuphelele. Ingabe imodi yokususa iphutha ingawuphazamisa umsebenzi wezinhlelo eziqhutshwa kuskripthi? Cha, bullshit. Isiphazamisi egobolondweni? Izimo ezimbalwa okungenzeka zindiza ekhanda lami njengamaphela ngezindlela ezihlukene. Inkomishi yesiphuzo esigcwele i-caffeine ithulula ngokushesha, uhambo olusheshayo lokuya ekhishini ukuze siphinde sinikezwe futhi... asihambe. Ngivula umbhalo bese ngibhekisisa i-shebang: #!/bin/sh.

/bin/sh - lokhu kuyi-bash symlink, ngakho-ke iskripthi sihunyushwa ngemodi ehambisanayo ye-POSIX, akunjalo? Yayingekho! Igobolondo elizenzakalelayo ku-Debian liwudeshi, okuyilokho kanye kubhekisa /bin/sh.

# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Jan 24  2017 /bin/sh -> dash

Ngenxa yecala, ngashintsha i-shebang yaba #!/bin/bash, isusiwe set -x futhi wazama futhi. Ekugcineni, ekulayisheni kabusha kwe-varnish okulandelayo, iphutha elibekezelelekayo livele ekuphumeni:

Jan 01 12:00:00 hostname varnishreload[32604]: /usr/sbin/varnishreload: line 124: echo: write error: Broken pipe
Jan 01 12:00:00 hostname varnishreload[32604]: VCL 'reload_20190101_120000_32604' compiled

Umugqa we-124, nakhu!

114 find_vcl_file() {
115         VCL_SHOW=$(varnishadm vcl.show -v "$VCL_NAME" 2>&1) || :
116         VCL_FILE=$(
117                 echo "$VCL_SHOW" |
118                 awk '$1 == "//" && $2 == "VCL.SHOW" {print; exit}' | {
119                         # all this ceremony to handle blanks in FILE
120                         read -r DELIM VCL_SHOW INDEX SIZE FILE
121                         echo "$FILE"
122                 }
123         ) || :
124
125         if [ -z "$VCL_FILE" ]
126         then
127                 echo "$VCL_SHOW" >&2
128                 fail "failed to get the VCL file name"
129         fi
130
131         echo "$VCL_FILE"
132 }

Kodwa njengoba kwavela, umugqa we-124 kunalokho awunalutho futhi awunasithakazelo. Ngingacabanga nje ukuthi iphutha lenzekile njengengxenye yemigqa eminingi eqala kulayini 116.
Yini ekugcineni ebhaliwe ku-variable VCL_FILE njengomphumela wokusebenzisa igobolondo elincane elingenhla?

Ekuqaleni, ithumela okuqukethwe okuguquguqukayo VLC_SHOW, idalwe kulayini 115, ukuya kumyalo olandelayo ngepayipi. Bese kwenzekani lapho?

Okokuqala, isebenzisa varnishadm, okuyingxenye yephakheji yokufaka i-varnish, ukulungisa i-varnish ngaphandle kokuqala kabusha.

umyalo omncane vcl.show -v isetshenziselwa ukukhipha konke ukucushwa kwe-VCL okucaciswe kuyo ${VCL_NAME}, ukuya ku-STDOUT.

Ukuze ubonise ukucushwa kwe-VCL okusebenzayo njengamanje, kanye nezinguqulo ezimbalwa zangaphambilini zokucushwa komzila we-varnish ezisekhona enkumbulweni, ungasebenzisa varnishadm vcl.list, okukhiphayo okuzofana nokulandelayo:

discarded   cold/busy       1 reload_20190101_120000_11903
discarded   cold/busy       2 reload_20190101_120000_12068
discarded   cold/busy       16 reload_20190101_120000_12259
discarded   cold/busy       16 reload_20190101_120000_12299
discarded   cold/busy       28 reload_20190101_120000_12357
active      auto/warm       32 reload_20190101_120000_12397
available   auto/warm       0 reload_20190101_120000_12587

Inani eliguquguqukayo ${VCL_NAME} setha kwenye ingxenye yombhalo varnishreload egameni le-VCL esebenzayo njengamanje, uma ikhona. Kulokhu kuzoba "layisha kabusha_20190101_120000_12397".

Kulungile, shintsha. ${VCL_SHOW} iqukethe ukucushwa okuphelele kwe-varnish, kuze kube manje kucacile. Manje ekugcineni ngiyaqonda ukuthi kungani ukuphuma kwedeshi nge set -x kuvele ukuthi yephukile - ihlanganisa okuqukethwe kokucushwa okuwumphumela.

Kubalulekile ukuqonda ukuthi ukucushwa okuphelele kwe-VCL ngokuvamile kungahlanganiswa kumafayela amaningi. Amazwana esitayela se-C asetshenziselwa ukuchaza lapho ifayela elilodwa lokumisa lifakwe kwelinye, futhi yilokho kanye umugqa olandelayo wekhodi amazwibela omayelana nawo.
I-syntax yamazwana achaza amafayela afakiwe inefomethi elandelayo:

// VCL.SHOW <NUM> <NUM> <FILENAME>

Izinombolo kulo mongo azibalulekile, sinentshisekelo egameni lefayela.

Manje-ke kwenzekani exhaphozini lemiyalo eqala kulayini 116?
Ake sikuthole.
Umyalo uqukethe izingxenye ezine:

  1. Elula echo, ebonisa inani lokuguquguquka ${VCL_SHOW}
    echo "$VCL_SHOW"
  2. awk, efuna umugqa (irekhodi), lapho inkambu yokuqala, ngemva kokuhlukanisa umbhalo, izoba ngu-“//”, kanti eyesibili izoba “VCL.SHOW”.
    I-Awk izobhala umugqa wokuqala ofana nalawa maphethini bese imisa ukucubungula ngokushesha.

    awk '$1 == "//" && $2 == "VCL.SHOW" {print; exit}'
  3. Ibhulokhi yekhodi egcina amanani enkundla eziguquguqukayo ezinhlanu, ezihlukaniswa yizikhala. I-variable yesihlanu FILE ithola wonke umugqa. Ekugcineni, i-echo yokugcina ibhala okuqukethwe kokuguquguqukayo ${FILE}.
    { read -r DELIM VCL_SHOW INDEX SIZE FILE; echo "$FILE" }
  4. Njengoba zonke izinyathelo 1 kuya kwezi-3 zivalelwe kugobolondo elincane, okukhiphayo yenani $FILE izobhalwa ngendlela eguquguqukayo VCL_FILE.

Njengoba ukuphawula okukulayini 119 kuphakamisa, lokhu kusebenzela injongo eyodwa yokuphatha ngokuthembekile amacala lapho i-VCL izobhekisela kumafayela anezinhlamvu zesikhala esimhlophe emagameni awo.

Ngiphawule nge-logic yasekuqaleni yokucubungula ${VCL_FILE} futhi wazama ukushintsha ukulandelana kwemiyalo, kodwa akuzange kuholele kunoma yini. Konke kungisebenzele ngokuhlanzekile, futhi endabeni yokuqala inkonzo, kunikeze iphutha.

Kubonakala sengathi iphutha alikwazi ukuphinda likhiqizeke lapho usebenzisa iskripthi mathupha, kuyilapho imizuzu elinganiselwe engu-30 isivele yaphela izikhathi eziyisithupha futhi, ngaphezu kwalokho, sekuvele umsebenzi obaluleke kakhulu, ophushela eceleni amanye amacala. Isonto lonke laligcwele imisebenzi ehlukahlukene futhi lahlanjululwa kancane ngenkulumo nge-sed kanye nengxoxo nomuntu ozobhalwa. Inkinga yephutha ku varnishreload ilahleke ngokungenakulungiseka ezihlabathini zesikhathi.

Lokho okubizwa nge-sed-fu ... empeleni ... udoti

Ngesonto elilandelayo kwaba nosuku olulodwa lwamahhala, ngakho nganquma ukuphinde ngithathe leli thikithi. Bengithemba ukuthi ebuchosheni bami, inqubo ethile yangemuva sonke lesi sikhathi ibifuna isixazululo sale nkinga, futhi kulokhu ngizoqonda nakanjani ukuthi yini engalungile.

Njengoba okokugcina ukushintsha nje ikhodi akuzange kusize, ngivele nganquma ukuyibhala kabusha ngiqala emugqeni we-116. Kunoma yikuphi, ikhodi ekhona yayiwubuwula. Futhi asikho nhlobo isidingo sokusebenzisa read.

Ukubheka iphutha futhi:
sh: echo: broken pipe - kulo myalo, i-echo isezindaweni ezimbili, kodwa ngisola ukuthi eyokuqala iyona enecala kakhulu (kahle, noma okungenani i-accomplice). I-Awk nayo ayikukhuthazi ukuzethemba. Futhi uma kwenzeka ngempela awk | {read; echo} umklamo uholela kuzo zonke lezi zinkinga, kungani ungawufaki esikhundleni? Lo myalo womugqa owodwa awusebenzisi zonke izici ze-awk, kanye nalokhu okwengeziwe read ku-appendage.

Kusukela ngesonto eledlule kube nombiko mayelana sedNgangifuna ukuzama amakhono ami engangisanda kuwathola futhi ngenze lula echo | awk | { read; echo} ibe eqondakala kakhudlwana echo | sed. Nakuba lena kungeyona indlela engcono kakhulu yokubamba isiphazamisi, ngicabange ukuthi okungenani ngizozama i-sed-fu yami futhi mhlawumbe ngifunde okuthile okusha ngale nkinga. Endleleni, ngacela uzakwethu, umbhali we-sed talk, ukuthi angisize ngiqhamuke neskripthi se-sed esisebenza kahle kakhudlwana.

Ngilahle okuqukethwe varnishadm vcl.show -v "$VCL_NAME" efayeleni ukuze ngigxile ekubhaleni iskripthi se-sed ngaphandle kobunzima bokuqalisa kabusha kwesevisi.

Incazelo emfushane yokuthi i-sed iphatha kanjani okokufaka ingatholakala ku incwadi yakhe ye-GNU. Emithonjeni ye-sed, uphawu n kucaciswe ngokusobala njengesihlukanisi somugqa.

Ngokudlula okuningana, nangeseluleko sozakwethu, sibhale umbhalo we-sed onikeze umphumela ofanayo nawo wonke umugqa wokuqala 116.

Ngezansi isampula lefayela elinedatha yokufaka:

> cat vcl-example.vcl
Text
// VCL.SHOW 0 1578 file with 3 spaces.vcl
More text
// VCL.SHOW 0 1578 file.vcl
Even more text
// VCL.SHOW 0 1578 file with TWOspaces.vcl
Final text

Kungase kungabonakali encazelweni engenhla, kodwa sinentshisekelo kuphela kumazwana okuqala // VCL.SHOW, futhi kungaba eziningana zazo kudatha yokufaka. Yingakho i-awk yokuqala iphela ngemva komdlalo wokuqala.

# шаг первый, вывести только строки с комментариями
# используя возможности sed, определяется символ-разделитель с помощью конструкции '#' вместо обычно используемого '/', за счёт этого не придётся экранировать косые в искомом комментарии
# определяется регулярное выражение “// VCL.SHOW”, для поиска строк с определенным шаблоном
# флаг -n позаботится о том, чтобы sed не выводил все входные данные, как он это делает по умолчанию (см. ссылку выше)
# -E позволяет использовать расширенные регулярные выражения
> cat vcl-processor-1.sed
#// VCL.SHOW#p
> sed -En -f vcl-processor-1.sed vcl-example.vcl
// VCL.SHOW 0 1578 file with 3 spaces.vcl
// VCL.SHOW 0 1578 file.vcl
// VCL.SHOW 0 1578 file with TWOspaces.vcl

# шаг второй, вывести только имя файла
# используя команду “substitute”, с группами внутри регулярных выражений, отображается только нужная группa
# и это делается только для совпадений, ранее описанного поиска
> cat vcl-processor-2.sed
#// VCL.SHOW# {
    s#.* [0-9]+ [0-9]+ (.*)$#1#
    p
}
> sed -En -f vcl-processor-2.sed vcl-example.vcl
file with 3 spaces.vcl
file.vcl
file with TWOspaces.vcl

# шаг третий, получить только первый из результатов
# как и в случае с awk, добавляется немедленное завершения после печати первого найденного совпадения
> cat vcl-processor-3.sed
#// VCL.SHOW# {
    s#.* [0-9]+ [0-9]+ (.*)$#1#
    p
    q
}
> sed -En -f vcl-processor-3.sed vcl-example.vcl
file with 3 spaces.vcl

# шаг четвертый, схлопнуть всё в однострочник, используя двоеточия для разделения команд
> sed -En -e '#// VCL.SHOW#{s#.* [0-9]+ [0-9]+ (.*)$#1#p;q;}' vcl-example.vcl
file with 3 spaces.vcl

Ngakho-ke okuqukethwe kweskripthi se-varnishreload kuzobukeka kanjena:

VCL_FILE="$(echo "$VCL_SHOW" | sed -En '#// VCL.SHOW#{s#.*[0-9]+ [0-9]+ (.*)$#1#p;q;};')"

I-logic engenhla ingafingqwa kanje:
Uma iyunithi yezinhlamvu ifana nenkulumo evamile // VCL.SHOW, bese ngobugovu ushwabadela umbhalo ohlanganisa zombili izinombolo kulowo mugqa, bese ulondoloza noma yini esele ngemva kwalo msebenzi. Khipha inani eligciniwe bese uqeda uhlelo.

Kulula, akunjalo?

Sijabule ngeskripthi se-sed kanye neqiniso lokuthi singena esikhundleni sayo yonke ikhodi yoqobo. Zonke izivivinyo zami zinikeze imiphumela oyifunayo, ngakho ngashintsha "i-varnishreload" kuseva futhi ngagijima futhi systemctl reload varnish. Iphutha elingcolile echo: write error: Broken pipe wahleka futhi ebusweni bethu. Ikhesa ecwayizayo ibilinde ukuthi kufakwe umyalo omusha endaweni emnyama yetheminali...

Source: www.habr.com

Engeza amazwana