Kudonha Pasi Gomba reTsuro: Iyo Nyaya Yeimwe Varnish Reload Kutadza - Chikamu 1

ghostinushanka, anga achirovera mabhatani kwemaminetsi makumi maviri apfuura sekunge hupenyu hwake hwaitsamira pazviri, anotendeukira kwandiri nekutarisa-musango mumaziso ake uye nekunyepedzera - "Dude, ndinofunga ndazviwana."

"Tarisa pano," anodaro, achinongedza chimwe chezviratidzo pachiratidziri, "Ini ndinobheja ngowani yangu tsvuku kuti kana tikawedzera pano zvandabva kukutumira," achinongedzera kune chimwe chikamu chekodhi, "chikanganiso hachichave chiripo. zvicharatidzwa."

Kushamisika uye kuneta, ndinogadzirisa sed kutaura kwatave kushanda pairi kwechinguva, chengetedza faira uye mhanya. systemctl varnish reload. Meseji yemhosho yanyangarika...

"Maemail andakachinjana nemukwikwidzi," wandaishanda naye akaenderera mberi, kunyemwerera kwake kwakakura kuita kunyemwerera kwechokwadi kwemufaro, "Zvakangoerekana zvauya kwandiri kuti ndiro dambudziko rimwe chete!"

Zvakatanga sei

Chinyorwa chinotora nzwisiso yekuti bash, awk, sed uye systemd inoshanda sei. Zivo yevarnish inosarudzwa, asi haidiwi.
Zvitampu zvenguva muzvidimbu zvakachinjwa.
Yakanyorwa ne ghostinushanka.
Ichi chinyorwa ishanduro yepakutanga yakatsikiswa muChirungu masvondo maviri apfuura; shanduro boikoden.

Zuva rinopenya nepamahwindo epanoramic pane mamwe matsutso mangwanani anodziya, kapu yechinwiwa chichangobva kugadzirirwa chine caffeine inozorora kure nekhibhodi, symphony yako yaunofarira inonzwika mumahedhifoni ako, ichinyudza kunze ruzha rwemakanika kiyibhodhi, uye yekutanga kupinda. mune rondedzero yematikiti ekumashure pabhodhi reKanban rinopenya zvine runyoro zita rekuti "Ongorora varnishreload" sh: echo: I/O kukanganisa mukuronga" (Ongorora "varnishreload sh: echo: I/O kukanganisa" mukuita). Kana zvasvika kune varnish, pane uye haigone kuve nenzvimbo yekukanganisa, kunyangwe ikasaunza chero matambudziko senge mune ino kesi.

Kune vasina kujairana nazvo varnishreload, ichi chinyoreso chakareruka chegoko chinoshandiswa kurodhazve gadziriso varnish - zvakare inonzi VCL.

Sezvo musoro wetikiti unoratidza, kukanganisa kwakaitika pane imwe yemaseva pachikuva, uye sezvo ndaiva nechokwadi chokuti varnish routing pachikuva yaishanda zvakanaka, ndakafunga kuti ichi chingava chikanganiso chiduku. Saka, meseji yakazoguma yatovharwa yakabuda. Ndinozvitorera tikiti racho, nechivimbo chakazara chokuti ndicharitara kuti ragadzirira mumaminiti asingasviki 30, ndinozvibata kumusana nokuda kwokubvisa rimwe marara mubhodhi ndodzokera kuzvinhu zvinokosha zvikuru.

Kurovera pamadziro pa200 km/h

Kuvhura faira varnishreload, pane imwe sevha inomhanya Debian Stretch, ndakaona shell script isingasviki mitsara ye200 kureba.

Sezvo ndapfuura nepakati peiyo script, ini handina kuona chero chinhu chingakonzeresa matambudziko pakuimhanyisa kakawanda kubva kune terminal.

Mushure mezvose, iyi idanho, kunyange kana ikaputsika, hapana munhu achanyunyuta, zvakanaka ... kwete zvakanyanya. Ini ndinomhanyisa script ndoona zvichanyorwa kune terminal, asi zvikanganiso hazvichaoneki.

Mamwe akati wandei anomhanya kuti ave nechokwadi chekuti ini handikwanise kuburitsa chikanganiso pasina kumwe kuedza, uye ndiri kutanga kufunga kuti ndingachinje sei script uye kuita kuti irambe ichikanda chikanganiso.

Iyo script inogona kukunda STDOUT (uchishandisa > &-)? Kana STDERR? Hapana chimwe cheizvi chakashanda pakupedzisira.

Sezviri pachena systemd neimwe nzira inogadzirisa nharaunda yekutanga, asi sei, uye nei?
Ini ndinovhura vim uye ndinogadzirisa varnishreload, kuwedzera set -x pasi peshebang, uchitarisira kuti debug kubuda kwe script kuchapa chiedza.

Iyo faira inogadziriswa, saka ndinoisazve varnish uye ndinoona kuti kuchinja kwacho kwakaputsa zvachose zvinhu zvose ... Kupera kusvibiswa kwakakwana, umo kune matani eC-like code. Kunyangwe kupuruzira muterminal hakuna kukwana kuwana kwainotangira. Ndakavhiringika chose. Ko debugging mode inogona kukanganisa kushanda kwezvirongwa zvakatangwa mune script? Kwete, hazvina maturo. Bug mugoko? Zviitiko zvinoverengeka zvinogoneka zviri kumhanya nemumusoro mangu semapete munzira dzakasiyana. Mukombe wewaini yekafeini inodururwa pakarepo, rwendo rwekukurumidza kuenda kukicheni kuti udzore mashizha uye ... toenda. Ndinovhura script uye ndinyatsotarisisa shebang: #!/bin/sh.

/bin/sh - iyi ingori symlink ku bash, saka script inodudzirwa muPOSIX-inoenderana modhi, handiti? Hazvina kudaro! Iyo yakasarudzika shell paDebian ndeye dash, uye ndizvo chaizvo zvazvinotaridzika. zvinoreva /bin/sh.

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

Semuyedzo, ndakachinja shebang kuita #!/bin/bash, dzadzimwa set -x ndokuedza zvakare. Pakupedzisira, pakuzotangazve varnish, chikanganiso chinoshivirika chakaonekwa mune zvakabuda:

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

Mutsara 124, heunoi!

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 }

Asi sezvazvinozoitika, mutsara 124 hauna chinhu uye hauna kufarira. Ini ndaigona kungofungidzira kuti chikanganiso chakaitika sechikamu chetambo yakawanda inotangira pamutsetse 116.
Chii chinozopedzisira chanyorwa kune chinja? VCL_FILE semhedzisiro yekuita iri pamusoro diki-shell?

Pakutanga, inotumira zviri mukati mekusiyana VLC_SHOW, yakagadzirwa pamutsetse 115, ichitevera murairo kuburikidza nepombi. Zvino chii chinoitika ipapo?

Kutanga, inoshandiswa ipapo varnishadm, iyo inhengo yevarnish yekuisa purogiramu, yekumisa varnish pasina kutangazve.

Sub-timu vcl.show -v inoshandiswa kuburitsa iyo yese VCL kumisikidzwa yakatsanangurwa mukati ${VCL_NAME}, ku STDOUT.

Kuti uratidze ikozvino inoshanda VCL kumisikidzwa, pamwe neanoverengeka yapfuura shanduro dzevarnish routing zvigadziriso zvichiri mundangariro, unogona kushandisa rairo. varnishadm vcl.list, kubuda kwayo kunenge kwakafanana neiri pazasi:

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

Variable value ${VCL_NAME} inoiswa mune chimwe chikamu chezvinyorwa varnishreload kuzita reiyo VCL inoshanda, kana iripo. Muchiitiko ichi ichave "reload_20190101_120000_12397".

Yakakura, yakasiyana ${VCL_SHOW} ine gadziriso yakakwana yevarnish, yakajeka ikozvino. Zvino ini pakupedzisira ndinonzwisisa kuti sei dash kubuda iri set -x yakave yakatyoka zvakanyanya - yaisanganisira zviri mukati meiyo mhedzisiro yekugadzirisa.

Izvo zvakakosha kuti unzwisise kuti yakazara VCL kumisikidzwa inogona kazhinji kubatanidzwa kubva kune akati wandei mafaera. C-maitiro ekutaura anoshandiswa kuona uko mamwe mafaera ekugadzirisa akaverengerwa mune mamwe, uye ndozvinoita mutsara unotevera wekodhi snippet.
Iyo syntax yemashoko anotsanangura anosanganisirwa mafaera ari mune inotevera fomati:

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

Nhamba hadzina kukosha mumamiriro ezvinhu aya, isu tinofarira zita refaira.

Chii chinozoitika mumatope emirairo kutanga pamutsetse 116?
Ngatizvionei.
Chikwata chine zvikamu zvina:

  1. Simple echo, iyo inodhinda kukosha kwekusiyana ${VCL_SHOW}
    echo "$VCL_SHOW"
  2. awk, iyo inotarisa mutsara (rekodhi) apo munda wekutanga, mushure mekuputsa zvinyorwa, "//", uye wechipiri "VCL.SHOW".
    Awk inonyora mutsara wekutanga unoenderana neaya mapatani uye wobva wamira kugadzirisa nekukasira.

    awk '$1 == "//" && $2 == "VCL.SHOW" {print; exit}'
  3. Ibhuroka yekodhi inochengeta kukosha kwemunda muzvikamu zvishanu, zvakapatsanurwa nenzvimbo. Yechishanu FILE kusiyanisa inogamuchira yakasara yemutsetse. Chekupedzisira, maungira ekupedzisira anonyora zviri mukati memuchinjiko ${FILE}.
    { read -r DELIM VCL_SHOW INDEX SIZE FILE; echo "$FILE" }
  4. Sezvo matanho ese 1 kusvika ku3 akavharirwa mune subshell, achiburitsa kukosha $FILE zvichanyorwa kune chinja VCL_FILE.

Sekutaura kuri kuita mutsara 119, izvi zvinoshandira chinangwa chega chekubata nyaya dzakavimbika uko VCL ichataura mafaera ane nzvimbo mumazita avo.

Ini ndataura nezve yekutanga kugadzirisa logic ye ${VCL_FILE} uye akaedza kushandura kutevedzana kwemirairo, asi hazvina kutungamira kune chero chinhu. Zvese zvakandiitira zvakanaka, asi pandakatanga sevhisi zvakapa kukanganisa.

Zvinoita sekuti mhosho haigone kudzokororwa kana uchimhanyisa script nemaoko, nepo maminitsi makumi matatu anofungidzirwa akatopera katanhatu uye, nekuwedzera, basa repamusoro rakaonekwa, richisundira zvimwe zvinhu parutivi. Zuva rose revhiki rakazadzwa nemabasa akasiyana-siyana uye rakangoderedzwa zvishoma nemushumo we sed uye kubvunzurudzwa nemunhu anenge asarudzwa. Dambudziko nekukanganisa mukati varnishreload yakarasika zvisingagadzirisiki mujecha renguva.

Yako inonzi sed-fu ... chaizvoizvo ... marara

Vhiki rakatevera ndakava nezuva rimwe chete remahara, saka ndakafunga kubata tikiti iri zvakare. Ndaitarisira kuti muuropi hwangu, imwe nzira yekumashure yanga ichitsvaga mhinduro kudambudziko iri nguva yese iyi, uye panguva ino ndaizonyatsonzwisisa zvaiitika.

Sezvo kungochinja kodhi hakuna kubatsira nguva yekupedzisira, ndangofunga kuinyora zvakare kutanga kubva pamutsetse 116. Chero zvazvingava, kodeti yaivapo yakanga yakapusa. Uye hapana zvachose chikonzero chekuishandisa read.

Kutarisa kukanganisa zvakare:
sh: echo: broken pipe - echo inoonekwa munzvimbo mbiri mune uyu murairo, asi ndinofungidzira kuti wekutanga ndiye angangove ane mhosva (kana angangoita mubatsiri). Awk haikurudzire chivimbo zvakare. Uye kana zviri izvo chaizvo awk | {read; echo} dhizaini inotungamirira kumatambudziko ose aya, wadii kuitsiva? Uyu mutsara-mutsetse haushandise ese maficha eawk, uye kunyangwe iyi yekuwedzera read pamusoro pe.

Kubva last week paive ne report on sed, ndaida kuedza unyanzvi hwangu huchangobva kuwanwa ndokurerutsa echo | awk | { read; echo} mune imwe inonzwisisika echo | sed. Kunyange iyi isiri iyo nzira yakanakisa yekuziva iyo bug, ndakafunga kuti ndimboedza sed-fu yangu uye pamwe ndidzidze chimwe chinhu chitsva nezve dambudziko. Ndiri munzira, ndakakumbira wandaishanda naye, munyori we sed talk, kuti andibatsire kuunza sed script inoshanda zvakanyanya.

Ndakadonhedza zvaiva mukati varnishadm vcl.show -v "$VCL_NAME" kune faira, saka ndaigona kutarisa kunyora sed script pasina kunetsekana kwesevhisi reboots.

Tsanangudzo pfupi yekuti sei sed process yekupinda inogona kuwanikwa mukati bhuku rake reGNU. Mune sed manyuko chiratidzo n zvakatsanangurwa semusaranisi wemutsara.

Mukupfuura kwakati wandei uye nekurudziro yewandinoshanda naye, takanyora sed script yakapa mhedzisiro yakafanana neyekutanga mutsara 116.

Pazasi pane faira remuenzaniso rine data rekuisa:

> 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

Izvi zvinogona kunge zvisiri pachena kubva pane tsananguro iri pamusoro, asi isu tinongofarira mhinduro yekutanga // VCL.SHOW, uye panogona kunge paine akati wandei mu data rekuisa. Ichi ndicho chikonzero iyo yepakutanga awk inopera mushure memutambo wekutanga.

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

Saka, zviri mukati mevarnishreload script zvichataridzika seizvi:

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

Iyo logic iri pamusoro inogona kutsanangurwa muchidimbu sezvizvi:
Kana tambo yacho ichienderana nechirevo chenguva dzose // VCL.SHOW, wodya nemakaro mashoko anosanganisira nhamba dzose dziri mumutsara uyu, uye chengetedza zvose zvinenge zvasara mushure mekushanda uku. Bvisa kukosha kwakachengetwa uye kupedza purogiramu.

Nyore, handizvo here?

Isu takafara ne sed script uye chokwadi chekuti yakatsiva iyo yese yekutanga kodhi. Yese bvunzo dzangu dzakapa mhedzisiro yaidiwa, saka ndakachinja "varnishreload" pane server ndokumhanya zvakare. systemctl reload varnish. Kukanganisa kwakaipa echo: write error: Broken pipe takaseka zviso zvedu zvakare. Iyo yekuchonya cursor yaive yakamirira murairo mutsva kuti upinzwe murima risina chinhu cheterminal...

Source: www.habr.com

Voeg