Ukuwa phantsi komngxuma woMvundla: Ibali lempazamo enye yokuqalisa kwakhona ivarnish-Icandelo 1

ghostinushanka, 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 ghostinushanka.
Lo mbhalo yinguqulelo yoqobo eyapapashwa ngesiNgesi kwiiveki ezimbini ezidlulileyo; inguqulelo boikoden.

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 ukulayishwa kwakhona kwevarnish, oku kumbhalo weqokobhe olula osetyenziselwa ukulayisha kwakhona uqwalaselo ivanishi - 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 ibhekisa /bin/sh.

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

Njengovavanyo, 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' compiled

Umgca 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_12587

Ixabiso 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:

  1. Elula echo, eprinta ixabiso lenguqu ${VCL_SHOW}
    echo "$VCL_SHOW"
  2. 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}'
  3. 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" }
  4. Ekubeni onke amanyathelo 1 ukuya ku-3 avalelwe kwi-subshell, ekhupha ixabiso $FILE iya kubhalwa kuguquguquko VCL_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 incwadi yakhe ye-GNU. 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 text

Oku 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.vcl

Ke, 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

Thenga ukusingathwa okuthembekileyo kwiindawo ezinokhuseleko lweDDoS, iiseva zeVPS VDS 🔥 Thenga ukusingathwa kwewebhusayithi okuthembekileyo ngokhuseleko lwe-DDoS, iiseva zeVPS VDS | ProHoster