A’ tuiteam sìos an toll coineanach: An sgeulachd mu aon mhearachd ath-thòiseachadh varnish - Pàirt 1

taibhse-shanka, a tha air a bhith a’ bualadh air na putanan airson an 20 mionaid a dh’fhalbh mar gum biodh a bheatha an urra ris, a’ tionndadh rium le sealladh leth-fhiadhaich na shùilean agus gàire seòlta - “A dhuine, tha mi a’ smaoineachadh gu bheil mi ga thuigsinn.”

“Seall an seo,” tha e ag ràdh, a’ comharrachadh aon de na samhlaidhean air an sgrion, “Tha mi a’ gealltainn ma chuireas sinn ris na chuir mi thugad an seo,” a’ comharrachadh earrann eile de chòd, “nach tèid am mearachd a thaisbeanadh tuilleadh.”

Beagan troimh-chèile agus sgìth, dh'atharraich mi an abairt sed air a bheil sinn air a bhith ag obair airson greis, shàbhail mi am faidhle, agus ruith mi e. systemctl varnish reloadDh’fhalbh an teachdaireachd mearachd…

“Na puist-d a dh’iomlaid mi leis an tagraiche,” lean mo cho-obraiche air, a ghàire a’ fàs gu bhith na fhìor ghàire aoibhneis, “Thuig e gu h-obann gur e seo an aon dhuilgheadas!”

Mar a thòisich e uile

Tha an t-artaigil seo a’ gabhail ris gu bheil tuigse agad air bash, awk, sed, agus systemd. Thathas a’ brosnachadh eòlas air Varnish ach chan eil e riatanach.
Chaidh stampaichean-ama ann an criomagan atharrachadh.
Sgrìobhte còmhla ri taibhse-shanka.
’S e eadar-theangachadh den teacsa thùsail a chaidh fhoillseachadh sa Bheurla dà sheachdain air ais a tha seo; eadar-theangachadh boikoden.

Tha a’ ghrian a’ deàrrsadh tron ​​uinneig mhòr-shluaigh air madainn bhlàth eile san fhoghar, tha deoch ùr-bhruichte le caffeine na laighe ri taobh a’ mheur-chlàir, tha co-sheirm fuaimean as fheàrr leam a’ cluich nam chluas-cinn, a’ cur às do fhuaim nam meur-chlàran meacanaigeach, agus tha a’ chiad inntrigeadh ann an liosta nan tiogaidean air a’ bhòrd Kanban a’ deàrrsadh gu spòrsail leis an tiotal cinntich “Rannsaich varnishreload sh: echo: mearachd I/O ann an staging.” Nuair a thig e gu varnish, chan eil àite ann airson mearachdan, eadhon ged nach eil iad ag adhbhrachadh dhuilgheadasan sam bith, mar a tha sa chùis seo.

Dhaibhsan nach eil eòlach air ath-luchdachadh varnish, 's e sgriobt shìmplidh a tha seo a thathar a' cleachdadh gus an rèiteachadh ath-luchdachadh varnish-a — ris an canar VCL cuideachd.

Mar a tha tiotal an tiogaid ag ràdh, thachair am mearachd air aon de na frithealaichean san àrd-ùrlar, agus leis gun robh mi cinnteach gun robh sligheadh ​​Varnish air an àrd-ùrlar ag obair ceart, bha mi den bheachd gur e mearachd bheag a bh’ ann. Dìreach teachdaireachd a thàinig gu crìch ann an sruth toraidh a bha dùinte mu thràth. Ghabh mi an tiogaid, misneachail gun comharraicheadh ​​mi e mar chrìochnaichte ann an nas lugha na 30 mionaid, gun tugadh mi moladh dhomh fhìn airson pìos sgudail eile a ghlanadh bhon bhòrd, agus gun tilleadh mi gu cùisean nas cudromaiche.

A’ bualadh a-steach do bhalla aig 200 cilemeatair san uair

A’ fosgladh an fhaidhle varnishreloadAir aon de na frithealaichean a bha a’ ruith Debian Stretch, chunnaic mi sgriobt slige nas lugha na 200 loidhne a dh’fhaid.

Às dèidh dhomh an sgriobt a ruith, cha do mhothaich mi dad a dh’ adhbhraicheadh ​​​​​​duilgheadasan nan ruithinn e grunn thursan gu dìreach bhon teirminéal.

Às dèidh a h-uile càil, ’s e àrd-ùrlar a th’ ann, agus mar sin eadhon ged a bhriseas e, cha ghearan duine sam bith, uill... chan eil cus ann. Bidh mi a’ ruith an sgriobt agus a’ coimhead dè a tha sgrìobhte chun an teirminail, ach chan eil mearachdan sam bith rim faicinn tuilleadh.

Beagan ruith eile gus dèanamh cinnteach nach urrainn dhomh am mearachd ath-riochdachadh gun oidhirp a bharrachd, agus tòisichidh mi a’ feuchainn ri faighinn a-mach mar a dh’atharraicheas mi an sgriobt seo agus toirt air mearachd a thilgeil.

An urrainn don sgriobt STDOUT a bhacadh (a’ cleachdadh > &-)? No STDERR? Cha do dh'obraich ceachtar aig a' cheann thall.

Gu soilleir, bidh systemd ag atharrachadh an àrainneachd tòiseachaidh ann an dòigh air choireigin, ach ciamar agus carson?
Bidh mi a’ tionndadh air vim agus a’ deasachadh varnishreload, a’ cur ris set -x dìreach fon t-seabang, an dòchas gun toir toradh dì-bhugachaidh an sgriobt beagan solais air.

Tha am faidhle air a chàradh, agus mar sin tha mi ag ath-thòiseachadh Varnish agus a’ faicinn gu bheil an t-atharrachadh air a h-uile càil a bhriseadh gu tur... Tha an toradh na bhreugan iomlan, le tòrr còd coltach ri C. Chan eil eadhon sgroladh san teirminéal gu leòr airson faighinn a-mach càite a bheil a h-uile càil a’ tòiseachadh. Tha mi gu tur troimh-chèile. Am faodadh modh dì-bhugachaidh buaidh a thoirt air na prògraman a tha a’ ruith san sgriobt? Chan e, tha sin gun chiall. Biast anns an t-slige? Bidh grunn shuidheachaidhean a dh’ fhaodadh a bhith ann a’ ruith tro mo cheann mar chearcan-fraoich. Tha an cupa caffeine air a fhalamhachadh sa bhad, turas luath dhan chidsin airson ath-lìonadh, agus... dheth a’ falbh. Tha mi a’ fosgladh an sgriobt agus a’ toirt sùil nas mionaidiche air an t-seabang: #!/bin/sh.

/bin/sh — chan eil ann ach ceangal sìmplidh bash, agus mar sin tha an sgriobt air a mhìneachadh ann am modh co-chòrdail ri POSIX, ceart? Chan eil sin fìor! Is e dash an t-slige bunaiteach ann an Debian, agus sin dìreach a tha e a’ dèanamh. a ’toirt iomradh /bin/sh.

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

Airson deuchainn, dh'atharraich mi an t-seabhag gu #!/bin/bash, air a dhubhadh às set -x agus dh'fheuch e a-rithist. Mu dheireadh, nuair a thòisich Varnish a-rithist, nochd mearachd fhulangach san toradh:

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

Loidhne 124, seo i!

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 }

Ach mar a thachair, bha loidhne 124 gu math falamh agus gun ùidh sam bith innte. Cha b’ urrainn dhomh ach gabhail ris gun do dh’èirich am mearachd mar phàirt de aithris ioma-loidhne a’ tòiseachadh air loidhne 116.
Dè a thèid a sgrìobhadh chun chaochladair aig a’ cheann thall? VCL_FILE mar thoradh air an fho-shlige a chaidh ainmeachadh gu h-àrd a chur an gnìomh?

Aig an toiseach, cuiridh e susbaint an atharrachaidh VLC_SHOW, air a chruthachadh air loidhne 115, chun an ath àithne tro phìob. Dè tha dol air adhart an sin, ma-thà?

An toiseach, tha e air a chleachdadh an sin varnishadm, a tha na phàirt den phacaid stàlaidh varnish, gus varnish a rèiteachadh gun ath-thòiseachadh.

Fo-àithne vcl.show -v air a chleachdadh gus an rèiteachadh VCL gu lèir a tha air a shònrachadh ann an toradh a thoirt a-mach ${VCL_NAME}, gu STDOUT.

Gus an rèiteachadh VCL a tha gnìomhach an-dràsta a thaisbeanadh, a bharrachd air grunn dhreachan roimhe de rèiteachaidhean sligheachaidh varnish a tha fhathast sa chuimhne, faodaidh tu an àithne a chleachdadh. varnishadm vcl.list, agus bidh an toradh aige coltach ris an fhear gu h-ìosal:

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

Luach caochlaideach ${VCL_NAME} suidhichte ann am pàirt eile den sgriobt varnishreload ri ainm an VCL a tha gnìomhach an-dràsta, ma tha fear ann. Anns a’ chùis seo, bidh e na “reload_20190101_120000_12397”.

Sàr-mhath, caochlaideach ${VCL_SHOW} anns a bheil an rèiteachadh iomlan airson varnish, gu ruige seo tha a h-uile rud gu math. A-nis tha mi mu dheireadh a’ tuigsinn carson a tha an toradh deas-bhòrd le set -x thionndaidh e a-mach gu robh e cho briste is gun robh susbaint an rèiteachaidh a thig às a sin ann.

Tha e cudromach tuigsinn gum faodar rèiteachadh VCL iomlan a chur ri chèile bho iomadh faidhle. Bithear a’ cleachdadh beachdan stoidhle C gus comharrachadh càite a bheil faidhlichean rèiteachaidh air an toirt a-steach taobh a-staigh feadhainn eile, agus is e sin dìreach a tha an loidhne còd gu lèir gu h-ìosal mu dheidhinn.
Seo mar a tha co-chàradh nan beachdan a tha a’ toirt cunntas air faidhlichean a tha air an gabhail a-steach:

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

Chan eil na h-àireamhan cudromach sa cho-theacsa seo, tha ùidh againn ann an ainm an fhaidhle.

Mar sin dè tha a’ dol air adhart anns a’ bhoglach òrdughan a’ tòiseachadh air loidhne 116?
Feuch gum faic sinn.
Tha an sgioba air a dhèanamh suas de cheithir pàirtean:

  1. Sìmplidh echo, a bheir a-mach luach caochladair ${VCL_SHOW}
    echo "$VCL_SHOW"
  2. awk, a bhios a’ lorg sreang (clàr) far a bheil a’ chiad raon, às dèidh an teacsa a roinn, na “//”, agus an dàrna fear na “VCL.SHOW”.
    Sgrìobhaidh Awk a-mach a’ chiad loidhne a tha a’ freagairt ris na pàtrain seo agus an uairsin stadaidh e sa bhad air a’ phròiseasadh.
    awk '$1 == "//" && $2 == "VCL.SHOW" {print; exit}'
  3. Bloc còd a bhios a’ stòradh luachan achaidhean, air an sgaradh le beàrnan, ann an còig caochladairean. Bidh an còigeamh caochladair, FILE, a’ faighinn a’ chòrr den loidhne. Mu dheireadh, bidh an aithris echo mu dheireadh a’ sgrìobhadh a-mach susbaint a’ chaochladair. ${FILE}.
    { read -r DELIM VCL_SHOW INDEX SIZE FILE; echo "$FILE" }
  4. Leis gu bheil a h-uile ceum 1 gu 3 air an cuairteachadh ann am fo-shlige, toradh an luach $FILE thèid a sgrìobhadh gu caochladair VCL_FILE.

Mar a tha am beachd air loidhne 119 a’ moladh, chan eil seo a’ frithealadh ach aon adhbhar: dèiligeadh gu earbsach ri cùisean far am bi an VCL a’ toirt iomradh air faidhlichean le caractaran fànais san ainm.

Chuir mi a-mach beachdan air an loidsig giullachd thùsail airson ${VCL_FILE} Dh’fheuch mi ri sreath nan òrduighean atharrachadh, ach cha do dh’obraich e. ​​Dh’obraich a h-uile càil gu math dhomhsa, ach nuair a thòisich mi an t-seirbheis, thug e mearachd.

Tha e coltach nach gabh am mearachd ath-riochdachadh nuair a ruitheas tu an sgriobt le làimh, agus tha an 30 mionaid ris an robh dùil air tighinn gu crìch sia tursan mu thràth, agus, a bharrachd air a h-uile càil, tha gnìomh le prìomhachas nas àirde air nochdadh, a’ putadh ghnìomhan eile an dàrna taobh. Bha an còrr den t-seachdain làn de dhiofar ghnìomhan, air an cur às a chèile beagan le taisbeanadh air sed agus agallamh le tagraiche. An duilgheadas leis a’ mhearachd ann an varnishreload chaidh a chall gu neo-sheasmhach ann an gainmheach na h-ùine.

Tha an rud ris an canar sed-fu agad... dha-rìribh... sgudal.

An ath sheachdain bha latha car saor agam, agus mar sin chuir mi romham obrachadh air an tiogaid seo a-rithist. Bha mi an dòchas gun robh pròiseas cùl-fhiosrachaidh air choreigin nam eanchainn air a bhith a’ sireadh fuasglaidh fad na h-ùine seo, agus an turas seo gum biodh mi cinnteach gun obraicheadh ​​a-mach dè an duilgheadas a bh’ ann.

Leis nach do chuidich atharrachadh sìmplidh còd an turas mu dheireadh, chuir mi romham ath-sgrìobhadh a’ tòiseachadh bho loidhne 116. Bha an còd a bh’ ann mar-thà caran gòrach co-dhiù. Agus chan eil feum idir air a chleachdadh read.

A’ coimhead air a’ mhearachd a-rithist:
sh: echo: broken pipe — tha echo a’ nochdadh ann an dà àite san àithne seo, ach tha mi an amharas gur e a’ chiad fhear an neach as dualtaiche a bhith ciontach (no co-dhiù co-chiontach). Chan eil Awk a’ brosnachadh misneachd nas motha. Agus ma tha seo fìor dha-rìribh awk | {read; echo} Tha an dealbhadh ag adhbhrachadh nan duilgheadasan seo uile, mar sin carson nach cuir thu fear eile na àite? Chan eil an àithne aon-loidhne seo a’ cleachdadh comasan awk gu lèir, agus tha an rud a bharrachd seo ann cuideachd. read A bharrachd air.

Bho chionn 's gun robh aithisg ann an t-seachdain sa chaidh mu dheidhinn sedBha mi airson na sgilean ùra agam fheuchainn agus rudan a dhèanamh nas sìmplidhe echo | awk | { read; echo} gu fear nas so-thuigsinniche echo | sedGed nach e seo an dòigh as fheàrr air a’ mhearachd aithneachadh, smaoinich mi gun dèanainn co-dhiù oidhirp air mo shed-fu agus is dòcha rudeigin ùr ionnsachadh mun duilgheadas. Air an t-slighe, dh’iarr mi air co-obraiche agam, ùghdar òraid mu dheidhinn sed, mo chuideachadh le bhith a’ tighinn suas le sgriobt sed nas èifeachdaiche.

Dhòirt mi an susbaint varnishadm vcl.show -v "$VCL_NAME" ann am faidhle, gus am b’ urrainn dhomh fòcas a chuir air an sgriobt sed a sgrìobhadh gun duilgheadas sam bith a bhith ag ath-thòiseachadh na seirbheis.

Gheibhear tuairisgeul goirid air mar a bhios sed a’ giullachd dàta cuir-a-steach ann an an leabhar-làimhe GNU aigeAnns a’ chòd thùsail sed, an samhla n air a shònrachadh gu soilleir mar sgaradh loidhne.

Le grunn oidhirpean agus beagan comhairle bhon cho-obraiche agam, sgrìobh sinn sgriobt sed a thug a-mach an aon toradh ris an loidhne thùsail 116 gu lèir.

Seo eisimpleir de fhaidhle cuir-a-steach:

> 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

Is dòcha nach eil e follaiseach bhon tuairisgeul gu h-àrd, ach chan eil ùidh againn ach anns a’ chiad bheachd. // VCL.SHOW, agus faodaidh grunn dhiubh a bhith anns an dàta cuir-a-steach. Sin as coireach gu bheil an awk tùsail a’ tighinn gu crìch an dèidh a’ chiad mhaids.

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

Mar sin, bidh susbaint an sgriobt varnishreload a’ coimhead rudeigin mar seo:

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

Faodar an loidsig gu h-àrd a chur an cèill gu goirid mar a leanas:
Ma tha an sreang a’ freagairt ris an abairt cunbhalach // VCL.SHOW, an uairsin sluig gu sanntach an teacsa anns a bheil an dà àireamh san loidhne sin agus sàbhail rud sam bith a tha air fhàgail às dèidh na h-obrach seo. Cuir a-mach an luach a chaidh a shàbhaladh agus cuir crìoch air a’ phrògram.

Sìmplidh, nach eil?

Bha sinn toilichte leis an sgriobt sed agus leis gun do chuir e an àite a’ chòd thùsail gu lèir. Thug na deuchainnean agam uile na toraidhean a bha mi ag iarraidh, agus mar sin dh’atharraich mi “varnishreload” air an fhrithealaiche agus ruith mi a-rithist e. systemctl reload varnishMearachd uamhasach echo: write error: Broken pipe rinn sinn gàire nar n-aghaidhean a-rithist. Bha cursair a’ priobadh a’ feitheamh ri àithne ùr ann am beàrn dorcha an teirminéil…

Source: www.habr.com

Cuir beachd ann