Te Hinga ki raro i te Kohanga Rapeti: Ko te Korero mo te Rahua o tetahi Varnish Reload - Wāhanga 1

ghostinushanka, i a ia e tarai ana i nga patene mo nga meneti 20 o mua me te mea ko tona oranga e whakawhirinaki ana ki a ia, ka huri mai ki ahau me te titiro ahua mohoao i ona kanohi me te kata maminga - "E hoa, ki taku whakaaro kua whiwhi ahau."

"Tirohia ki konei," ka kii ia, ka tohu ki tetahi o nga tohu i runga i te mata, "Ka pai ahau ki taku potae whero mena ka tapiritia e matou ki konei nga mea i tukuna atu e ahau ki a koe," ka tohu ki tetahi atu waahanga o te waehere, "kaore te hapa ka whakaatuhia."

He iti nei te pohehe me te ngenge, ka whakarereketia e ahau te whakaaturanga sed kua roa e mahi ana matou, tiakina te konae ka oma systemctl varnish reload. Kua ngaro te karere hapa...

"Ko nga imeera i whakawhitihia e au me te kaitono," ka haere tonu taku hoa mahi, i te mea ka nui haere tana ataata ki te tino ataata o te koa, "Katahi ka mohio ahau he rite tonu te raru!"

I pehea i timata ai

Ka mau te tuhinga ki te maarama ki te mahi a bash, awk, sed me te systemd. Ko te mohio ki te varnish he pai ake, engari kaore e hiahiatia.
Kua hurihia nga tohu wa i roto i nga snippets.
I tuhia me ghostinushanka.
Ko tenei tuhinga he whakamaoritanga o te tuhinga taketake i whakaputaina ki te reo Ingarihi e rua wiki ki muri; whakamaoritanga boikoden.

Ka whiti te ra i roto i nga matapihi maataki i tetahi atu ata mahana o te ngahuru, he kapu inu inu kawhe katahi ano ka taka mai i te papapātuhi, ka oro mai te oro tino pai ki o taringa, ka toremi i te ngaru o nga papapātuhi miihini, me te urunga tuatahi. i roto i te rarangi o nga tikiti backlog i runga i te papa o Kanban e whiti ana ki te taitara tino nui "Tirotirohia te varnishreload" sh: echo: I/O hapa i roto i te whakaari "(Tirotiro "varnishreload sh: echo: I/O hapa" i roto i te whakaari). Ina tae mai ki te varnish, kei reira kaore e taea te waahi mo nga hapa, ahakoa kaore e puta he raru penei i tenei keehi.

Mo te hunga kaore i te mohio varnishreload, he tuhinga anga ngawari tenei hei uta ano i te whirihoranga parani - ka kiia ano ko VCL.

E ai ki te taitara o te tiiti, i puta te hapa i runga i tetahi o nga kaitoro i runga i te atamira, a, i te mea i tino mohio ahau kei te pai te mahi o te arai parani i runga i te atamira, i mahara ahau he hapa iti tenei. Na, he karere noa i mutu i roto i te awa putanga kua kati. Ka tango ahau i te tiiti maku, i runga i te tino maia ka tohu ahau kua reri i roto i te iti iho i te 30 meneti, ka patipati i toku tuara mo te whakakore i te poari i tetahi atu para ka hoki ki nga kaupapa nui ake.

Ka pakaru ki te pakitara i te 200 km/h

Te whakatuwhera i te kōnae varnishreload, i runga i tetahi o nga tūmau e whakahaere ana i a Debian Stretch, i kite ahau i tetahi tuhinga anga iti iho i te 200 rarangi te roa.

I te haere ki roto i te tuhinga, kaore au i kite i tetahi mea ka puta he raru ka rere tika mai i te tauranga.

Ina hoki, he atamira tenei, ahakoa ka pakaru, karekau he tangata e amuamu, kaare... karekau rawa. Ka whakahaerehia e ahau te tuhinga ka kite i nga mea ka tuhia ki te tauranga, engari kua kore e kitea nga hapa.

He tokorua ano ka oma ki te whakarite kia kore e taea e au te whakaputa i te hapa me te kore e whakapau kaha, a ka timata ahau ki te whakaaro me pehea te whakarereke i tenei tuhinga me te tuku i te hapa.

Ka taea e te tuhinga te whakakore i te STDOUT (ma te whakamahi > &-)? STDERR ranei? Kaore tetahi o enei i mahi i te mutunga.

Te ahua nei ka whakarerekehia e te systemd te taiao whakaoho, engari me pehea, me te aha?
Ka whakatuwherahia e ahau te vim me te whakatika varnishreload, taapiri set -x kei raro tonu i te shebang, me te tumanako ka whakamarama te putanga patuiro o te tuhinga.

Kua whakatikahia te konae, no reira ka utaina ano e ahau te varnish ka kite kua pakaru nga mea katoa i te huringa ... Ko te ngongo he tino raru, he maha nga tohu C-rite. Ahakoa ko te panuku i roto i te tauranga kaore e ranea ki te kimi i hea ka tiimata. Kei te tino raruraru ahau. Ka taea e te aratau patuiro te pa ki te mahi o nga papatono kua whakarewahia ki te tuhinga? Kao, he koretake. Bug i roto i te anga? He maha nga ahuatanga e rere ana i roto i toku mahunga ano he moka i nga huarahi rereke. Ko te kapu o te inu kawheina ka pau tonu, he haerenga tere ki te kihini ki te whakaki i nga rakau ka... ka haere. Ka whakatuwherahia e ahau te tuhinga me te ata titiro ki te shebang: #!/bin/sh.

/bin/sh - he hononga hono noa tenei ki te bash, no reira ka whakamaoritia te tuhinga ki te aratau POSIX-hototahi, tika? Kare ra! Ko te anga taunoa i runga i a Debian he puihi, a koira tonu te ahua. kōrero /bin/sh.

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

Hei whakamatautau, i hurihia e ahau te shebang ki #!/bin/bash, kua mukua set -x ka whakamatau ano. I te mutunga, i muri mai i te whakaara ano o te parani, ka puta he hapa i te putanga:

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

Raina 124, anei!

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 }

Engari i te mea ka puta, ko te rarangi 124 he tino kau, kaore he painga. Ka taea noa e au te whakaaro i puta te hapa hei waahanga o te aho raina maha ka timata i te rarangi 116.
He aha te mea ka tuhia ki te taurangi? VCL_FILE na te mahi i te anga-roto i runga ake nei?

I te timatanga, ka tukuna e ia nga ihirangi o te taurangi VLC_SHOW, i hangaia i runga i te rarangi 115, e whai ana i te whakahau ma te paipa. Na ka aha i reira?

Tuatahi, ka whakamahia ki reira varnishadm, he wahanga o te kete whakaurunga parani, mo te whakatu parani me te kore e timata ano.

Kapa-iti vcl.show -v whakamahia ki te whakaputa i te whirihoranga VCL katoa kua tohua ki roto ${VCL_NAME}, ki STDOUT.

Hei whakaatu i te whirihoranga VCL hohe o naianei, me te maha o nga putanga o mua o nga whirihoranga ararere parani kei te maumahara tonu, ka taea e koe te whakamahi i te whakahau varnishadm vcl.list, ka rite te putanga ki tera i raro nei:

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

Uara taurangi ${VCL_NAME} kua whakauruhia ki tetahi atu waahanga o te tuhinga varnishreload ki te ingoa o te VCL e hohe ana i tenei wa, mena he kotahi. I tenei keehi ka "reload_20190101_120000_12397".

Nui, taurangi ${VCL_SHOW} kei roto i te whirihoranga katoa mo te parani, maamaa mo naianei. Inaianei kua mohio ahau he aha te putanga taarua set -x i tino pakaru - kei roto nga ihirangi o te whirihoranga kua puta.

He mea nui kia mohio koe ka taea te whakakotahi i te whirihoranga VCL katoa mai i nga konae maha. Ka whakamahia nga korero ahua-C ki te tautuhi i te waahi kua whakauruhia etahi konae whirihoranga ki etahi atu, a koinei te mea e whai ake nei o te rarangi tohu waehere.
Ko te wetereo mo nga korero e whakaahua ana i nga konae whakauru kei te ahua e whai ake nei:

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

Ko nga nama kaore he mea nui i roto i tenei horopaki, kei te pirangi matou ki te ingoa konae.

He aha te mutunga mai i te repo o nga whakahau ka timata i te rarangi 116?
Kia ata whakaarohia.
E wha nga wahanga o te roopu:

  1. Maamaa echo, ka tā i te uara o te taurangi ${VCL_SHOW}
    echo "$VCL_SHOW"
  2. awk, e rapu ana mo te rarangi (rekoata) ko te mara tuatahi, i muri i te pakaru o te tuhinga, ko “//”, ko te tuarua ko “VCL.SHOW”.
    Ka tuhia e Awk te rarangi tuatahi e rite ana ki enei tauira ka mutu tonu te mahi.

    awk '$1 == "//" && $2 == "VCL.SHOW" {print; exit}'
  3. He poraka waehere e pupuri ana i nga uara mara ki nga taurangi e rima, ka wehea e nga waahi. Ko te taurangi FILE tuarima ka whiwhi i te toenga o te raina. Ka mutu, ka tuhia e te paoro whakamutunga nga ihirangi o te taurangi ${FILE}.
    { read -r DELIM VCL_SHOW INDEX SIZE FILE; echo "$FILE" }
  4. I te mea ko nga kaupae 1 ki te 3 kei roto i te anga-roto, e whakaputa ana i te uara $FILE ka tuhia ki te taurangi VCL_FILE.

E ai ki nga korero mo te rarangi 119, ko tenei anake te kaupapa o te whakahaere pono i nga keehi ka tohutoro a VCL i nga konae me nga waahi ki o raatau ingoa.

Kua korero ahau i te arorau tukatuka taketake mo ${VCL_FILE} ka ngana ki te huri i te raupapa whakahau, engari kaore i puta ki tetahi mea. I pai nga mea katoa ki ahau, engari i taku tiimata i te ratonga ka puta he hapa.

Ko te ahua karekau e taea te whakaputa i te hapa i te wa e whakahaere a ringa ana i te tuhinga, i te mea kua pau nga meneti 30 e ono nga wa, a, hei taapiri, kua puta ake he mahi matua nui ake, ka peia etahi atu take ki te taha. I whakakiia te toenga o te wiki ki nga momo mahi, a, he paku waimeha noa e te ripoata mo te sed me te uiuinga me tetahi kaitono. He raru kei roto varnishreload kua ngaro noa atu i te onepu o te wa.

Ko to mea e kiia nei he sed-fu... he tino... para

I te wiki i muri mai he ra tino kore noa ahau, no reira ka whakatau ahau ki te tarai ano i tenei tikiti. I tumanako ahau i roto i taku roro, i rapua e etahi mahi papamuri he otinga mo tenei raru i enei wa katoa, a i tenei wa ka tino marama ahau ki nga mea kei te haere.

I te mea ko te whakarereke noa i te waehere kaore i awhina i tera wa, ka whakatau ahau ki te tuhi ano mai i te rarangi 116. Ahakoa he aha, he poauau te waehere o naianei. A kaore rawa he take ki te whakamahi read.

Ka titiro ano ki te hapa:
sh: echo: broken pipe — E rua nga waahi ka puta te paoro i roto i tenei whakahau, engari ki taku whakaaro ko te mea tuatahi ko te tangata hara (he hoa mahi ranei). Kare hoki a Awk e whakahihiri i te maia. A ki te mea he pono awk | {read; echo} ko te hoahoa ka arahi ki enei raru katoa, he aha e kore ai e whakakapi? Karekau tenei whakahau raina-kotahi e whakamahi i nga ahuatanga katoa o te awk, tae atu ki tenei taapiri read i tua atu.

Mai i tera wiki i puta he ripoata mo sed, I pirangi ahau ki te whakamatau i aku pukenga hou kua riro mai me te ngawari echo | awk | { read; echo} ki te maarama ake echo | sed. Ahakoa ehara tenei i te huarahi pai ki te tautuhi i te pepeha, i whakaaro ahau me whakamatau taku sed-fu me te ako i tetahi mea hou mo te raru. I te ara, i tono ahau ki taku hoa mahi, te kaituhi o te korero sed, ki te awhina i ahau ki te whakaputa i tetahi tuhinga sed pai ake.

I tukuna e ahau nga ihirangi varnishadm vcl.show -v "$VCL_NAME" ki tetahi konae, na reira ka taea e au te aro ki te tuhi i te tuhinga sed me te kore he raru o te whakaara ano i nga ratonga.

He whakaahuatanga poto mo te pehea e kitea ai te whakaurunga o nga tukanga sed tana pukapuka GNU. I roto i nga puna sed te tohu n kua tohua hei whakawehe raina.

I roto i te maha o nga paahitanga me nga tohutohu a taku hoa mahi, i tuhia e matou he tuhinga tuhi he rite nga hua ki te rarangi tuatahi katoa 116.

Kei raro nei he tauira konae me nga raraunga whakauru:

> 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

Kaore pea tenei e tino kitea mai i te whakaahuatanga i runga ake nei, engari ko te korero tuatahi anake ta matou e aro atu // VCL.SHOW, he maha pea kei roto i nga raraunga whakauru. Koinei te take ka mutu te awk taketake i muri i te tukinga tuatahi.

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

Na, ko nga korero o te tuhinga varnishreload ka penei te ahua:

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

Ko te arorau o runga ake nei ka taea te whakaatu poto penei:
Mēnā e ōrite ana te aho ki tētahi kīanga auau // VCL.SHOW, ka pau nga kupu e mau ana i nga tau e rua i tenei rarangi, ka tiakina nga mea katoa e toe ana i muri i tenei mahi. Tukuna te uara kua penapena ka mutu te hotaka.

He ngawari, ehara?

I koa matou ki te tuhinga sed me te mea i whakakapihia e ia nga waehere taketake katoa. Ko aku whakamatautau katoa i puta nga hua e hiahiatia ana, no reira i hurihia e ahau te "varnishreload" i runga i te tūmau ka oma ano. systemctl reload varnish. Hapa kino echo: write error: Broken pipe ka kata ano ki o matou kanohi. Kei te tatari te pehu whakamohio ki te whakauru i tetahi whakahau hou i roto i te pouri pouri o te tauranga...

Source: will.com

Tāpiri i te kōrero