, emva kokuba ebethelele amaqhosha kwimizuzu engama-20 edlulileyo ngokungathi ubomi bakhe buxhomekeke kuyo, ujike kum ngenkangeleko engacacanga emehlweni akhe kunye nokuhleka okubukhali - "Mfo, ndicinga ukuba ndiyifumene."
“Jonga apha,” utshilo, ekhomba enye yeesimboli esikrinini, “Ndibheja umnqwazi wam obomvu ukuba songeza apha le ndikuthumelele yona,” esalatha kwelinye icandelo lekhowudi, “impazamo ayisayi kuphinda ibekho. iya kuboniswa."
Ndididekile kwaye ndidiniwe, ndilungisa intetho ye-sed ebesisebenza kuyo ixeshana, gcina ifayile kwaye ubaleke. systemctl varnish reload. Umyalezo wemposiso unyamalele...
“Ii-imeyile endazitshintshiselana nomgqatswa,” uqhubeke watsho umlingane wam, njengoko uncumo lwakhe lwalukhula lwaba luncumo lokwenyani lovuyo, “Kwathi qatha kum ukuba le yingxaki kanye kanye!”
Yaqala njani yonke loo nto
Inqaku lithatha ukuqonda malunga nendlela i-bash, i-awk, i-sed kunye ne-systemd esebenza ngayo. Ulwazi lwe-varnish luyakhethwa, kodwa alufunwa.
Izitampu zexesha kwiziqwengana zitshintshiwe.
Ibhalwe nge .
Lo mbhalo yinguqulelo yoqobo eyapapashwa ngesiNgesi kwiiveki ezimbini ezidlulileyo; inguqulelo .
Ilanga likhanya kwiifestile zepanoramic kwenye intsasa eshushu yasekwindla, ikomityi yesiselo esinecaffeine esandula ukulungiswa siphumla kude nebhodi yezitshixo, i-symphony oyithandayo yezandi izandi kwii-headphones zakho, ukurhashaza kweekeyboards zoomatshini, kunye nokungena kokuqala. kuluhlu lwamatikiti asemva kwibhodi ye-Kanban ngokudlalayo ikhazimla ngesihloko esibuhlungu "Phanda i-varnishreload" sh: echo: I/O impazamo kwistaging” (Phanda “i-varnishreload sh: i-echo: I/O impazamo” kumdlalo). Xa kuziwa kwi-varnish, kukho kwaye akunakubakho naliphi na igumbi leempazamo, nokuba azibangeli naziphi na iingxaki njengale meko.
Kwabo bangaqhelananga nayo , oku kumbhalo weqokobhe olula osetyenziselwa ukulayisha kwakhona uqwalaselo - ikwabizwa ngokuba yi-VCL.
Njengoko isihloko setikiti sibonisa, iphutha lenzeke kwelinye lamaseva kwinqanaba, kwaye ekubeni ndiqinisekile ukuba i-varnish yomzila kwinqanaba yayisebenza ngokufanelekileyo, ndacinga ukuba oku kuya kuba yimpazamo encinci. Ke, umyalezo nje oye waphelela kumjelo osele uvaliwe wemveliso. Ndizithathela itikiti, ndiqinisekile ukuba ndiza kuliphawula lilungile kwisithuba esingaphantsi kwemizuzu engama-30, ndiziphulule emqolo ngenxa yokususa enye inkunkuma ebhodini ndize ndibuyele kwimibandela ebaluleke ngakumbi.
Ukuntlitheka eludongeni nge-200 km/h
Ukuvula ifayile varnishreload, kwenye yeeseva ezilawulwayo Debian Ndiyibonile i-shell script engaphantsi kwemigca engama-200 ubude.
Emva kokuba ndidlule kwiskripthi, andizange ndiqaphele nantoni na enokubangela iingxaki xa iqhuba amaxesha amaninzi ngokuthe ngqo kwi-terminal.
Emva koko, eli linqanaba, nangona liphuka, akukho mntu uya kukhononda, kakuhle ... kungekhona kakhulu. Ndiqhuba iskripthi kwaye ndibone ukuba kuya kubhalwa ntoni kwi-terminal, kodwa iimpazamo azisabonakali.
Isibini esingaphezulu siyabaleka ukuze siqinisekise ukuba andikwazi ukuvelisa kwakhona impazamo ngaphandle komzamo owongezelelweyo, kwaye ndiyaqala ukuqonda indlela yokutshintsha esi script kwaye ndisenze silahle impazamo.
Ngaba iskripthi sinokuyibhala ngaphezulu i-STDOUT (usebenzisa > &-)? Okanye STDERR? Akukho namnye kwezi owasebenza ekugqibeleni.
Kuyabonakala ukuba i-systemd ngandlela thile iyilungisa imeko-bume yokuqalisa, kodwa njani, kwaye ngoba?
Ndivula i-vim kwaye ndihlele varnishreload, ukongeza set -x ekunene phantsi kwe-shebang, ngethemba lokuba imveliso yolungiso lweempazamo yeskripthi izakwenza ukukhanya okuthile.
Ifayile ilungisiwe, ngoko ke ndiphinda ndilayishe i-varnish kwaye ndibone ukuba utshintsho lwaphule ngokupheleleyo yonke into ... Ukukhutshwa kukuphazamiseka okupheleleyo, apho kukho iitoni zekhowudi efana ne-C. Nokuskrola kwi-terminal akwanelanga ukufumana apho iqala khona. Ndididekile ngokupheleleyo. Ngaba indlela yolungiso lweempazamo inokuchaphazela ukusebenza kweenkqubo eziqaliswe kwiscript? Hayi, bubudenge. Ibug eqokobheni? Iimeko ezininzi ezinokubakho zibaleka entlokweni yam njengamaphela kumacala ahlukeneyo. Ikomityi yesiselo se-caffeine ikhutshwe ngokukhawuleza, uhambo olukhawulezayo ukuya ekhitshini ukuzalisa isitokisi kunye ... sihambe. Ndivula iskripthi kwaye ndijonge ngakumbi kwi-shebang: #!/bin/sh.
/bin/sh — yi-bash symlink nje, ngoko ke iskripthi sitolikwa kwimowudi ehambelana nePOSIX, akunjalo? Akunjalo! Igobolondo elimiyo kwi Debian - yidash, kwaye yiloo nto kanye eyenzelwe yona /bin/sh.
# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Jan 24 2017 /bin/sh -> dashNjengovavanyo, ndiyitshintshe i-shebang #!/bin/bash, icinyiwe set -x kwaye ndazama kwakhona. Ekugqibeleni, emva kokuqalisa ngokutsha kwevarnish, kwavela impazamo enyamezelekayo kwisiphumo:
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' compiledUmgca we-124, nanku!
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 njengoko kuvela, umgca we-124 awunanto kwaye awunamdla. Ndinokucinga kuphela ukuba impazamo yenzekile njengenxalenye yomtya wemigca emininzi eqala kumgca we-116.
Yintoni ekugqibeleni ebhaliweyo kwinguqu? VCL_FILE njengesiphumo sokuphumeza i-sub-shell?
Ekuqaleni, ithumela imixholo yoguquko VLC_SHOW, eyenziwe kumgca we-115, ilandela umyalelo ngombhobho. Kwaye ke kwenzeka ntoni apho?
Okokuqala, isetyenziswa apho varnishadm, eyinxalenye yephakheji yokufakela i-varnish, yokumisela i-varnish ngaphandle kokuqalisa kwakhona.
Iqela elingaphantsi vcl.show -v isetyenziselwa ukukhupha lonke uqwalaselo lweVCL olukhankanyiweyo ${VCL_NAME}, ukuya STDOUT.
Ukubonisa uqwalaselo olusebenzayo lwangoku lweVCL, kunye neenguqulelo ezininzi zangaphambili zoqwalaselo lwendlela yevarnish esekwinkumbulo, ungasebenzisa umyalelo. varnishadm vcl.list, imveliso eya kufana nale ingezantsi:
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_12587Ixabiso eliguquguqukayo ${VCL_NAME} ifakwe kwenye indawo yescript varnishreload kwigama le VCL esebenzayo ngoku, ukuba kukho enye. Kule meko iya kuba "reload_20190101_120000_12397".
Enkulu, iyaguquguquka ${VCL_SHOW} iqulethe ubumbeko olupheleleyo lwevanishi, ecacileyo okwangoku. Ngoku ekugqibeleni ndiyaqonda ukuba kutheni imveliso yedash set -x Ivele yaphuke kakhulu - ibandakanya imixholo yoqwalaselo olunesiphumo.
Kubalulekile ukuqonda ukuba uqwalaselo olupheleleyo lweVCL lunokuhlala lubotshelelwa kunye kwiifayile ezininzi. Izimvo zesimbo se-C zisetyenziselwa ukuchonga apho iifayile ezithile zoqwalaselo zifakwe kwezinye, kwaye yiloo nto ilandelayo umgca wekhowudi ye-snippet.
Isivakalisi sezimvo ezichaza iifayile ezibandakanyiweyo zikule fomathi ilandelayo:
// VCL.SHOW <NUM> <NUM> <FILENAME>Amanani awabalulekanga kulo mongo, sinomdla kwigama lefayile.
Kwenzeka ntoni ekugqibeleni kumgxobhozo wemiyalelo oqala kumgca we-116?
Masiyiqonde.
Iqela linamacandelo amane:
- Elula
echo, eprinta ixabiso lenguqu${VCL_SHOW}echo "$VCL_SHOW" awk, ekhangela umgca (irekhodi) apho insimu yokuqala, emva kokuphula isicatshulwa, "//", kwaye okwesibini "VCL.SHOW".
I-Awk izakubhala umgca wokuqala ongqamanisa ezi patheni kwaye emva koko uyeke ukuqhubekeka ngoko nangoko.awk '$1 == "//" && $2 == "VCL.SHOW" {print; exit}'- Ibhlokhi yekhowudi egcina amaxabiso entsimi kwiinguqu ezintlanu, ezahlulwe zizithuba. Uluhlu lwesihlanu lweFILE lufumana umgca oseleyo. Ekugqibeleni, i-echo yokugqibela ibhala imixholo yoguquko
${FILE}.{ read -r DELIM VCL_SHOW INDEX SIZE FILE; echo "$FILE" } - Ekubeni onke amanyathelo 1 ukuya ku-3 avalelwe kwi-subshell, ekhupha ixabiso
$FILEiya kubhalwa kuguquguqukoVCL_FILE.
Njengoko iikhomenti ezikumgca 119 zibonisa, oku kuphumeza injongo eyodwa yokusingatha amatyala ngokuthembekileyo apho i-VCL iya kujonga iifayili ezinezithuba emagameni azo.
Ndikhe ndaphawula ngenkqubo yokuqala yengqiqo ${VCL_FILE} kwaye yazama ukutshintsha ulandelelwano lomyalelo, kodwa ayizange ikhokelele kuyo nantoni na. Yonke into yayindisebenzele kakuhle, kodwa xa ndandiqala inkonzo yanika impazamo.
Kubonakala ngathi impazamo ayinakuphinda iphindeke xa uqhuba iskripthi ngesandla, ngelixa le mizuzu engama-30 ibisele iphelelwe amaxesha amathandathu kwaye, ukongeza, kuye kwavela umsebenzi ophambili ophambili, ukutyhala eminye imiba ecaleni. Iveki yonke yazaliswa ngemisebenzi eyahlukahlukeneyo kwaye yahlanjululwa nje kancinci yingxelo nge-sed kunye nodliwano-ndlebe nomviwa. Ingxaki ngempazamo kwi varnishreload yalahleka ngokungenakulungiseka entlabathini yexesha.
Oko kubizwa ngokuba yi-sed-fu ... ngokwenene ... yinkunkuma
Kwiveki elandelayo ndandinosuku olunye olukhululekileyo, ngoko ke ndagqiba ekubeni ndilwe neli tikiti kwakhona. Ndiyathemba ukuba engqondweni yam, inkqubo ethile yangasemva yayifuna isisombululo kule ngxaki lonke eli xesha, kwaye ngeli xesha ngokuqinisekileyo ndiya kuqonda ukuba kuqhubeka ntoni.
Okoko ukutshintsha nje ikhowudi akuzange kuncede kwixesha elidlulileyo, ndigqibe ekubeni ndiyibhale kwakhona ukuqala kumgca we-116. Kwimeko nayiphi na into, ikhowudi ekhoyo yayisisiphukuphuku. Kwaye akukho mfuneko yokuyisebenzisa read.
Ukujonga impazamo kwakhona:
sh: echo: broken pipe - i-echo ibonakala kwiindawo ezimbini kulo myalelo, kodwa ndiyakrokrela ukuba eyokuqala ngoyena nobangela (okanye ubuncinci iqabane). Awk ayikhuthazi ukuzithemba nayo. Kwaye ukuba kunjalo ngokwenene awk | {read; echo} uyilo lukhokelela kuzo zonke ezi ngxaki, kutheni ungatshintshi? Lo myalelo womgca omnye awusebenzisi zonke iimpawu ze-awk, kunye nale yongezelelweyo read Ukwengeza.
Ukususela kwiveki ephelileyo bekukho ingxelo sed, bendifuna ukuzama ubuchule bam obutsha kwaye ndibenze lula echo | awk | { read; echo} ibe yinto eqondakalayo echo | sed. Ngelixa ngokuqinisekileyo ayisiyiyo eyona ndlela ilungileyo yokuchonga i-bug, ndiye ndacinga ukuba ndingazama i-sed-fu yam kwaye mhlawumbi ndifunde into entsha malunga nale ngxaki. Endleleni, ndacela umlingane wam, umbhali wentetho ye-sed, ukuba andincede ndize nesikripthi seed esisebenza ngakumbi.
Ndalahla iziqulatho varnishadm vcl.show -v "$VCL_NAME" kwifayile, ukuze ndigxile ekubhaleni iscript sed ngaphandle kobuxhakaxhaka benkonzo yokuqalisa kwakhona.
Inkcazo emfutshane yendlela yokufakwa kwenkqubo ye-sed inokufunyanwa ngayo . Kwimithombo ye sed isimboli n ichazwe ngokucacileyo njengomahluli welayini.
Kwiipasile ezininzi kunye neengcebiso zogxa wam, sibhale iskripthi se-sed esinika isiphumo esifanayo nawo wonke umgca wokuqala we-116.
Ngezantsi yisampuli yefayile eneenkcukacha zongeniso:
> 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 textOku kusenokungabonakali kwinkcazo engentla, kodwa sinomdla kuphela kwinkcazo yokuqala // VCL.SHOW, kwaye kunokubakho uninzi lwazo kwidatha yegalelo. Kungenxa yoko le nto i-awk yokuqala iphela emva 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.vclKe, imixholo yeskripthi sokulayisha ivarnish iya kujongeka ngolu hlobo:
VCL_FILE="$(echo "$VCL_SHOW" | sed -En '#// VCL.SHOW#{s#.*[0-9]+ [0-9]+ (.*)$#1#p;q;};')"Le ngqiqo ingasentla ingachazwa ngokufutshane ngolu hlobo lulandelayo:
Ukuba umtya uhambelana nentetho eqhelekileyo // VCL.SHOW, emva koko ngokunyoluka isicatshulwa esibandakanya omabini amanani kulo mgca, kwaye ugcine yonke into eseleyo emva kwalo msebenzi. Khupha ixabiso eligciniweyo kwaye uphelise inkqubo.
Kulula, akunjalo?
Sasonwabile ngombhalo we-sed kunye nenyaniso yokuba ithathe indawo yayo yonke ikhowudi yokuqala. Zonke iimvavanyo zam zinike iziphumo ezifunwayo, ndiye ndatshintsha "i-varnishreload" kwiseva kwaye ndayiqhuba kwakhona. systemctl reload varnish. Impazamo embi echo: write error: Broken pipe saphinda sahleka ebusweni bethu. Ikhesa eqhwanyazayo yayilindele umyalelo omtsha ukuba ungeniswe kubumnyama obungenanto be-terminal...
umthombo: www.habr.com
