“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
Lo mbhalo uyinguqulo yokuqala eyashicilelwa ngesiNgisi emasontweni amabili edlule; ukuhumusha
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
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 /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:
- Elula
echo
, ebonisa inani lokuguquguquka${VCL_SHOW}
echo "$VCL_SHOW"
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}'
- 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" }
- Njengoba zonke izinyathelo 1 kuya kwezi-3 zivalelwe kugobolondo elincane, okukhiphayo yenani
$FILE
izobhalwa ngendlela eguquguqukayoVCL_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 sed
Ngangifuna 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 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