Ho oela fatše ka Rabbit Hole: Pale ea phoso e le 'ngoe ea ho qalisa varnish - Karolo ea 1

ghostinshanka, ha a ntse a penya likonopo ka metsotso e 20 e fetileng joalokaha eka bophelo ba hae bo itšetlehile ka eona, o retelehela ho 'na ka mahlo a hae a sa hlakang le ho bososela ka bolotsana - "Dude, ke nahana hore ke e fumane."

“Sheba mona,” o rialo, a supa le leng la matšoao a skrineng, “ke becha katiba ea ka e khubelu hore haeba re ka eketsa mona seo ke sa tsoa u romela sona,” a supa karolo e ’ngoe ea khoutu, “phoso e ke ke ea hlola e e-ba teng. e tla bontšoa."

Ke maketse ebile ke khathetse, ke fetola polelo ea sed eo esale re sebetsa ka nako e telele, boloka faele ebe u matha. systemctl varnish reload. Molaetsa oa phoso o nyametse...

"Li-imeile tseo ke ileng ka li fapanyetsana le mokhethoa," mosebetsi-'moho le 'na a tsoela pele, ha seso sa hae se ntse se hola ho ba pososelo ea 'nete ea thabo, "Ka tšohanyetso ke ile ka elelloa hore bothata bona ke bona hantle!"

Kamoo tsohle li qalileng kateng

Sengoloa se nka kutloisiso ea hore na bash, awk, sed le systemd li sebetsa joang. Tsebo ea varnish e khethoa, empa ha e hlokehe.
Litempe tsa linako tsa likotoana li fetotsoe.
E ngotsoe le ghostinshanka.
Temana ena ke phetolelo ea ea pele e hatisitsoeng ka Senyesemane libeke tse peli tse fetileng; phetolelo boikoden.

Letsatsi le chaba ka lifensetere tse hlollang ka botle hoseng ho hong ho futhumetseng ha hoetla, kopi ea seno se sa tsoa lokisoa se nang le caffeine e lutse hole le keyboard, melumo eo u e ratang ka ho fetesisa li-headphones tsa hau, e khantša lerata la likonopo tsa mochini, le ho kena ha pele. lethathamong la litekete tse saletseng morao letlapeng la Kanban le khanya ka mokhoa o hlakileng ka sehlooho se reng "Fuputsa varnishreload" sh: echo: I/O phoso ha ho etsoa staging” (Batlisisa “varnishreload sh: echo: I/O phoso” sethaleng). Ha ho tluoa tabeng ea li-varnish, ho na le 'me ho ke ke ha e-ba le sebaka sa liphoso, le haeba li sa hlahise mathata leha e le afe joalo ka tabeng ena.

Bakeng sa ba sa tloaelaneng le ho kenya li-varnish hape, ona ke mongolo o bonolo oa khetla o sebelisetsoang ho kenya tlhophiso bocha varnish - hape e bitsoa VCL.

Joalokaha sehlooho sa tekete se bontša, phoso e etsahetse ho e 'ngoe ea li-server sethaleng,' me kaha ke ne ke kholisehile hore mokhoa oa ho tsamaisa li-varnish sethaleng o ne o sebetsa hantle, ke ne ke nahana hore sena e tla ba phoso e nyenyane. Kahoo, molaetsa feela o ileng oa fella molatsoaneng o seng o koetsoe. Ke inkela tekete, ka kholiseho e feletseng ea hore ke tla e tšoaea e lokile ka nako e ka tlaase ho metsotso e 30, ke ikotla sefuba ka lebaka la ho tlosa lithōle tse ling hape le ho khutlela litabeng tsa bohlokoa haholoanyane.

Ho thula lebota ka lebelo la 200 km/h

Ho bula faele varnishreload, ho e 'ngoe ea li-server tse mathang Debian Stretch, ke bone script ea khetla e ka tlaase ho mela ea 200 ka nako e telele.

Ha ke qeta ho bala sengoloa, ha kea ka ka hlokomela letho le ka bakang mathata ha ke le matha ka makhetlo a mangata ka kotloloho ho tsoa ho terminal.

Ha e le hantle, ena ke sethala, le haeba se robeha, ha ho motho ea tla tletleba, hantle ... eseng haholo. Ke tsamaisa script mme ke bona se tla ngolloa terminal, empa liphoso ha li sa bonahala.

Ba bang ba 'maloa ba matha ho etsa bonnete ba hore ha ke khone ho hlahisa phoso ntle le boiteko leha e le bofe bo eketsehileng,' me ke qala ho fumana mokhoa oa ho fetola mongolo ona le ho o etsa hore o ntse o lahlela phoso.

Na sengoloa se ka fetisa STDOUT (ho sebelisa > &-)? Kapa STDERR? Ha ho le e 'ngoe ea tsona e ileng ea sebetsa qetellong.

Kamoo ho bonahalang kateng systemd ka tsela e itseng e fetola tikoloho ea ho qala, empa joang, hona hobane'ng?
Ke bula vim ebe ke hlophisa varnishreload, ho eketsa set -x hantle tlas'a shebang, ka tšepo ea hore tlhahiso ea debug ea script e tla fana ka leseli.

Faele e lokisoa, kahoo ke kenya li-varnish hape 'me ke bona hore phetoho e ile ea senya ntho e' ngoe le e 'ngoe ka ho feletseng ... Ho senya ke moferefere o feletseng, oo ho oona ho nang le lithane tsa khoutu ea C. Esita le ho phenya ka har'a terminal ha hoa lekana ho fumana moo ho qalang teng. Ke ferekane ka ho feletseng. Na mokhoa oa ho lokisa liphoso o ka ama ts'ebetso ea mananeo a qalisoang ka mongolo? Tjhe, ke bosawana. Phoso ka khetla? Maemo a 'maloa a ka bang teng a ntse a matha hloohong ea ka joalo ka maphele ka nqa tse fapaneng. Senoelo sa seno se nang le k'hafeine se felloa ke nako hang-hang, leeto le potlakileng la ho ea kichineng ho ea tlatsa thepa le ... rea tsamaea. Ke bula script mme ke shebisisa shebang: #!/bin/sh.

/bin/sh - ena ke symlink feela ho bash, kahoo script e hlalosoa ka mokhoa o lumellanang le POSIX, ho joalo? Ha ho joalo! Khetla ea kamehla ho Debian ke dash, 'me ke kamoo e shebahalang kateng. e bolela /bin/sh.

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

E le teko, ke ile ka fetola shebang ho #!/bin/bash, hlakotsoe set -x mme a leka hape. Qetellong, ha varnish e qala bocha, phoso e mamellehang e ile ea hlaha sephethong:

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

Mola oa 124, ke ena!

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 }

Empa ha e le hantle, mola oa 124 ha o na letho ebile ha o na thahasello. Ke nahana feela hore phoso e etsahetse e le karolo ea likhoele tse ngata tse qalang moleng oa 116.
Ke eng e qetellang e ngotsoe ho feto-fetoha? VCL_FILE ka lebaka la ho phethahatsa karoloana e ka holimo?

Qalong, e romela litaba tsa phetoho VLC_SHOW, e entsoeng moleng oa 115, ho latela taelo ka phala. Mme ebe ho etsahalang moo?

Ntlha ea pele, e sebelisoa moo varnishadm, e leng karolo ea sephutheloana sa ho kenya varnish, bakeng sa ho theha varnish ntle le ho qala hape.

Sehlopha se senyenyane vcl.show -v e sebelisetsoang ho hlahisa tlhophiso eohle ea VCL e boletsoeng ho ${VCL_NAME}, ho STDOUT.

Ho bonts'a tlhophiso ea hona joale ea VCL e sebetsang, hammoho le mefuta e mengata e fetileng ea litlhophiso tsa li-varnish tse ntseng li le mohopolong, o ka sebelisa taelo. varnishadm vcl.list, tlhahiso ea eona e tla tšoana le e ka tlase:

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

Boleng bo feto-fetohang ${VCL_NAME} e kentsoe karolong e 'ngoe ea mongolo varnishreload ho lebitso la VCL e sebetsang hajoale, haeba e le teng. Tabeng ena e tla ba "reload_20190101_120000_12397".

E kholo, e feto-fetohang ${VCL_SHOW} e na le tlhophiso e felletseng ea varnish, e hlakileng hajoale. Joale qetellong kea utloisisa hore na ke hobane'ng ha dash e hlahisoa set -x e ile ea robeha haholo - e ne e kenyelletsa likahare tsa tlhophiso e hlahisitsoeng.

Ho bohlokoa ho utloisisa hore tlhophiso e felletseng ea VCL hangata e ka kopanngoa ho tsoa lifaeleng tse 'maloa. Litlhaloso tsa mofuta oa C li sebelisoa ho khetholla moo lifaele tse ling tsa tlhophiso li kenyellelitsoeng ho tse ling, 'me ke seo mola o latelang oa snippet oa khoutu o buang ka sona.
Syntax ea litlhaloso tse hlalosang lifaele tse kenyellelitsoeng e ka sebopeho se latelang:

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

Linomoro ha li bohlokoa moelelong ona, re thahasella lebitso la faele.

Qetellong ho etsahalang mokhoabong oa litaelo ho qala moleng oa 116?
Ha re e utloisise.
Sehlopha se na le likarolo tse 'nè:

  1. E bonolo echo, e hatisang boleng ba phetoho ${VCL_SHOW}
    echo "$VCL_SHOW"
  2. awk, e batlang mola (rekoto) moo karolo ea pele, ka mor'a ho senya mongolo, e leng "//", 'me ea bobeli ke "VCL.SHOW".
    Awk e tla ngola mola oa pele o tsamaellanang le lipaterone tsena ebe e emisa ho sebetsa hanghang.

    awk '$1 == "//" && $2 == "VCL.SHOW" {print; exit}'
  3. Sebaka sa khoutu se bolokang boleng ba tšimo ka mefuta e mehlano, e arotsoe ke libaka. Phapang ea bohlano ea FILE e amohela karolo e setseng ea mohala. Qetellong, echo ea ho qetela e ngola litaba tsa phetoho ${FILE}.
    { read -r DELIM VCL_SHOW INDEX SIZE FILE; echo "$FILE" }
  4. Kaha mehato eohle ea 1 ho isa ho 3 e kentsoe ka har'a subshell, e hlahisang boleng $FILE e tla ngolloa ho feto-fetoha VCL_FILE.

Joalo ka ha maikutlo a moleng oa 119 a fana ka maikutlo, sena se sebeletsa morero o le mong oa ho sebetsana le linyeoe moo VCL e tla supa lifaele tse nang le libaka mabitsong a tsona.

Ke fane ka maikutlo mabapi le mokhoa oa ho sebetsa oa mantlha oa ${VCL_FILE} mme a leka ho fetola tatellano ya taelo, empa ha e a ka ya lebisa ho letho. Ntho e 'ngoe le e' ngoe e ile ea sebetsa hantle ho 'na, empa ha ke qala tšebeletso e fane ka phoso.

Ho bonahala eka phoso ha e khonehe hape ha o tsamaisa mongolo ka letsoho, athe metsotso e 30 eo ho nahanoang hore e se e felile ka makhetlo a ts'eletseng, ho ekelletsa moo, ho hlahile mosebetsi o tlang pele, o sutumelletsang litaba tse ling ka thoko. Beke e setseng e ne e tletse mesebetsi e fapa-fapaneng 'me e ile ea hlapolloa hanyenyane feela ka tlaleho ea sed le puisano le mokhethoa. Bothata ba phoso ka varnishreload e ne e lahlehile ka mokhoa o ke keng oa lokisoa lehlabatheng la nako.

Ntho ea hau eo ho thoeng ke sed-fu ... ke ... lithōle

Bekeng e hlahlamang ke ile ka ba le letsatsi le le leng la mahala, kahoo ke ile ka etsa qeto ea ho tšoara tekete ena hape. Ke ne ke tšepile hore bokong ba ka, ts'ebetso e 'ngoe ea morao-rao e' nile ea batla tharollo ea bothata bona nako ena eohle, 'me lekhetlong lena ke tla utloisisa hantle se etsahalang.

Kaha ho fetola khoutu ha hoa ka ha thusa lekhetlo la ho qetela, ke ile ka etsa qeto ea ho e ngola hape ho tloha moleng oa 116. Leha ho le joalo, khoutu e teng e ne e le booatla. 'Me ho hang ha ho hlokahale ho e sebelisa read.

Ho sheba phoso hape:
sh: echo: broken pipe - echo e hlaha libakeng tse peli taelong ena, empa ke belaela hore ea pele ke eona e ka bang molato (kapa bonyane ke motlatsi). Awk le eona ha e khothaletse ho itšepa. 'Me haeba ho hlile ho joalo awk | {read; echo} moralo o lebisa mathateng ana kaofela, ke hobane'ng ha u sa e nkele sebaka? Taelo ena ea mola o le mong ha e sebelise likarolo tsohle tsa awk, esita le ena e eketsehileng read holim'a moo.

Ho tloha bekeng e fetileng ho bile le tlaleho ka sed, ke ne ke batla ho leka tsebo ea ka eo ke sa tsoa e fumana le ho nolofatsa echo | awk | { read; echo} ka tsela e utloisisoang ho feta echo | sed. Le hoja ena e se mokhoa o molemo ka ho fetisisa oa ho tseba bothata, ke ne ke nahana hore bonyane ke leke sed-fu ea ka 'me mohlomong ke ithute ho hong ka bothata boo. Ha ke ntse ke le tseleng, ke ile ka kopa mosebetsi-'moho le 'na, mongoli oa sed talk, hore a nthuse ho hlahisa sed script e sebetsang hantle haholoanyane.

Ke lahlile litaba tse ka hare varnishadm vcl.show -v "$VCL_NAME" ho faele, kahoo ke ne ke khona ho tsepamisa maikutlo ho ngoleng sed script ntle le bothata ba ho qala ts'ebeletso.

Tlhaloso e khuts'oane ea hantle hore na sed process input e ka fumanoa joang bukana ea hae ea GNU. Mehloling ea sed letšoao n e hlalositsoe ka ho hlaka joalo ka searolahi sa mela.

Ka makhetlo a 'maloa le ka likhothaletso tsa mosebetsi-'moho le 'na, re ngotse sed script e faneng ka sephetho se tšoanang le mola kaofela oa pele oa 116.

Ka tlase ke mohlala oa faele o nang le data e kentsoeng:

> 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

Sena se ka 'na sa se ke sa totobala ho tsoa tlhalosong e ka holimo, empa re thahasella feela tlhaloso ea pele // VCL.SHOW, 'me ho ka ba le tse' maloa tsa tsona boitsebisong ba ho kenya. Ke ka lebaka leo awk ea pele e fellang ka mor'a papali ea pele.

# шаг первый, вывести только строки с комментариями
# используя возможности 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

Kahoo, litaba tsa sengoloa sa varnishreload li tla shebahala tjena:

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

Monahano o ka holimo o ka hlalosoa ka bokhutšoanyane ka tsela e latelang:
Haeba khoele e lumellana le polelo e tloaelehileng // VCL.SHOW, ebe ka meharo u harola mongolo o kenyelletsang linomoro ka bobeli moleng ona, 'me u boloke ntho e' ngoe le e 'ngoe e setseng ka mor'a ts'ebetso ena. Ntsha boleng bo bolokilweng mme o fedise lenaneo.

E bonolo, na ha ho joalo?

Re ne re thabetse sed script le taba ea hore e nkile sebaka sa khoutu eohle ea mantlha. Liteko tsohle tsa ka li fane ka liphetho tse lakatsehang, kahoo ke ile ka fetola "varnishreload" ho seva mme ka e tsamaisa hape. systemctl reload varnish. Phoso e mpe echo: write error: Broken pipe a tsheha hape difahlehong tsa rona. Sesepa sa ho panya se ne se emetse hore ho kenngoe taelo e ncha ka har'a sebaka se lefifi sa terminal...

Source: www.habr.com

Eketsa ka tlhaloso