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

Ghostinushanka, às deidh dha a bhith a’ bualadh air na putanan airson an 20 mionaid roimhe mar gum biodh a bheatha an urra ris, thionndaidh e thugam le faireachdainn leth-fhiadhaich na shùilean agus gàire glic - “A dhuine uasail, tha mi a’ smaoineachadh gu bheil mi a ’tuigsinn.”

“Seall an seo,” tha e ag ràdh, a’ comharrachadh aon de na samhlaidhean air an sgrion, “Cuiridh mi geall dhut an ad dhearg agam, ma chuireas sinn ris na chuir mi thugad a-null an seo,” a’ comharrachadh earrann eile den chòd, “cha bhith a’ mhearachd air a thaisbeanadh tuilleadh. ”

Beagan troimh-chèile agus sgìth, bidh mi ag atharrachadh an aithris sed air a bheil sinn air a bhith ag obair airson greis, sàbhail am faidhle, agus ruith systemctl varnish reload. Tha an teachdaireachd mearachd air a dhol à bith...

“Na puist-d a dh’ atharraich mi leis an tagraiche, ”lean mo cho-obraiche air adhart, fhad‘ s a bha an smirk aige a ’dol a-steach do fhìor ghàire làn aoibhneis,“ Thàinig e a-mach orm gu h-obann gur e seo an aon dhuilgheadas! ”

Ciamar a thòisich e uile

Tha an artaigil a’ gabhail ri tuigse air mar a tha bash, awk, sed agus systemd ag obair. Is fheàrr eòlas air varnish ach chan eil feum air.
Chaidh clàran-ama ann an criomagan atharrachadh.
Air a sgrìobhadh le Ghostinushanka.
'S e eadar-theangachadh a tha san teacsa seo den chiad fhoillseachadh sa Bheurla o chionn dà sheachdain; eadar-theangachadh balach.

Bidh a’ ghrian a’ deàrrsadh tro na h-uinneagan panoramach air madainn bhlàth foghair eile, bidh cupa de dheoch caffeinichte ùr air a ghrùdadh a’ laighe air falbh bhon mheur-chlàr, tha symphony de fhuaimean a’ cluich thairis air meirgeadh meur-chlàran meacanaigeach anns na fònaichean-cluaise, agus tha a’ chiad inntrig air liosta nan tiogaidean air ais air bòrd a’ kanban a’ deàrrsadh gu sgiobalta leis an tiotal uamhasach “Rannsaich varnishrenheload sh: echo varnishreload: echo varnishreload: echo varnishreload sh: echo varnishreload. Mearachd I/O” san àrd-ùrlar). Nuair a thig e gu varnish, chan eil mearachdan ann agus chan urrainn dhaibh a bhith ann, eadhon ged nach toir iad gu duilgheadasan sam bith, mar a tha sa chùis seo.

Dhaibhsan nach eil eòlach air varnishreload, is e sgriobt shligean sìmplidh a tha seo a thèid a chleachdadh gus an rèiteachadh ath-luchdachadh varnish - ris an canar cuideachd VCL.

Mar a tha tiotal na tiogaid a’ moladh, thachair a’ mhearachd air aon de na frithealaichean air an àrd-ùrlar, agus leis gu robh mi misneachail gun robh slighe bhàirnis air an àrd-ùrlar ag obair ceart, ghabh mi ris gur e mearachd beag a bhiodh ann. Mar sin, dìreach teachdaireachd a chaidh a-steach do shruth toraidh dùinte mar-thà. Bidh mi a’ gabhail tiogaid dhomh fhìn, le làn mhisneachd gun comharraich mi deiseil ann an nas lugha na 30 mionaid, pat mi fhìn air a’ ghualainn airson bòrd an ath sgudal a ghlanadh agus faighinn air ais gu rudan nas cudromaiche.

A 'briseadh a-steach do bhalla aig 200 km/h

A' fosgladh faidhle varnishreload, air aon de na frithealaichean a’ ruith Debian Stretch, chunnaic mi sgriobt shligean nas lugha na loidhnichean 200 a dh’ fhaid.

A’ ruith tron ​​sgriobt, chan fhaca mi dad a dh’ fhaodadh duilgheadasan adhbhrachadh le bhith ga ruith iomadh uair gu dìreach bhon cheann-uidhe.

Às deidh na h-uile, is e ìre a tha seo, eadhon ged a bhriseas e, cha dèan duine gearan, uill ... chan eil cus. Bidh mi a’ ruith an sgriobt agus a’ faicinn dè a thèid a sgrìobhadh chun cheann-uidhe, ach chan eil na mearachdan rim faicinn tuilleadh.

Bidh ruith no dhà eile a’ dèanamh cinnteach nach urrainn dhomh a’ mhearachd ath-riochdachadh gun beagan oidhirp a bharrachd, agus tòisichidh mi a’ faighinn a-mach ciamar a dh’ atharraicheas mi an sgriobt seo agus gun dèan mi mearachd fhathast.

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

Gu follaiseach bidh siostam ag atharrachadh an àrainneachd ruith ann an dòigh air choreigin, ach ciamar, agus carson?
Bidh mi a’ tionndadh vim air agus a’ deasachadh varnishreload, a' cur set -x dìreach fon shebang, an dòchas gun toir dì-bhugachadh toradh an sgriobt beagan solas.

Tha am faidhle stèidhichte, agus mar sin bidh mi ag ath-luchdachadh varnish agus chì mi gun do bhris an t-atharrachadh a h-uile càil gu tur ... Chan eil eadhon scrollaidh anns an inneal-crìochnachaidh gu leòr gus faighinn a-mach càite an tòisich e. Tha mi gu tur troimh-a-chèile. Am faod modh deasbaid buaidh a thoirt air obair phrògraman a tha air an ruith ann an sgriobt? Chan e, bullshit. Bug san t-slige? Tha grunn shuidheachaidhean a dh’ fhaodadh a bhith ag itealaich nam cheann mar cockroaches ann an diofar stiùiridhean. Bidh cupa de dheoch làn caffeine a’ falmhachadh sa bhad, turas sgiobalta don chidsin airson ath-sholarachadh agus… rachamaid. Bidh mi a’ fosgladh an sgriobt agus a’ toirt sùil nas mionaidiche air an shebang: #!/bin/sh.

/bin/sh - chan eil an seo ach bash symlink, agus mar sin tha an sgriobt air a mhìneachadh ann am modh a tha co-chosmhail ri POSIX, ceart? Cha robh e ann! Is e dash an t-slige bunaiteach air Debian, agus sin dìreach dè 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 shebang gu #!/bin/bash, air a thoirt air falbh set -x agus dh'fheuch e a-rithist. Mu dheireadh, nuair a chaidh varnish ath-luchdachadh às deidh sin, 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 e!

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 thionndaidh e, tha loidhne 124 caran falamh agus gun ùidh. Cha b’ urrainn dhomh ach gabhail ris gun do thachair a’ mhearachd mar phàirt de ioma-loidhne a’ tòiseachadh air loidhne 116.
Dè tha sgrìobhte mu dheireadh ris a 'chaochladair VCL_FILE mar thoradh air an fho-bhlas gu h-àrd a chuir an gnìomh?

Aig an toiseach, bidh e a 'cur susbaint a' chaochlaideach VLC_SHOW, air a chruthachadh air loidhne 115, chun an ath àithne tron ​​​​phìob. Agus an uairsin dè thachras an sin?

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

fo-cheannard vcl.show -v air a chleachdadh gus an rèiteachadh VCL gu lèir a chaidh a shònrachadh ann an ${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 slighe varnish a tha fhathast nad chuimhne, faodaidh tu an àithne a chleachdadh varnishadm vcl.list, agus bidh an toradh aca coltach ris na leanas:

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 gu ainm an VCL a tha gnìomhach an-dràsta, ma tha gin ann. Anns a 'chùis seo bidh e "reload_20190101_120000_12397".

Ceart gu leòr, caochlaideach. ${VCL_SHOW} anns a bheil an rèiteachadh iomlan airson varnish, gu ruige seo soilleir. A-nis tha mi a’ tuigsinn mu dheireadh carson a tha toradh dash le set -x thionndaidh e a-mach gu robh e cho briste - bha e a’ toirt a-steach susbaint an rèiteachaidh a thàinig às.

Tha e cudromach tuigsinn gum faod rèiteachadh VCL iomlan a bhith air a chruinneachadh bho iomadh faidhle. Bithear a’ cleachdadh beachdan ann an stoidhle C gus mìneachadh far an deach aon fhaidhle rèiteachaidh a thoirt a-steach do fhear eile, agus sin dìreach cò mu dheidhinn a tha an loidhne chòd a leanas.
Tha an cruth a leanas anns a’ cho-chòrdadh airson beachdan a’ toirt cunntas air na faidhlichean a chaidh a ghabhail a-steach:

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

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

Mar sin dè a thachras anns a’ bhoglach òrdughan a thòisicheas air loidhne 116?
Feuch gum faic sinn.
Tha an àithne air a dhèanamh suas de cheithir earrannan:

  1. Sìmplidh echo, a sheallas luach a’ chaochladair ${VCL_SHOW}
    echo "$VCL_SHOW"
  2. awk, a tha a’ coimhead airson loidhne (clàr), far am bi a’ chiad raon, às deidh dhut an teacsa a roinn, “//”, agus an dàrna fear “VCL.SHOW”.
    Sgrìobhidh Awk a-mach a’ chiad loidhne a fhreagras ris na pàtrain sin agus an uairsin stadaidh e air a’ ghiollachd sa bhad.

    awk '$1 == "//" && $2 == "VCL.SHOW" {print; exit}'
  3. Bloc de chòd a bhios a 'stòradh luachan an raoin ann an còig caochladairean, air an sgaradh le beàrnan. Gheibh an còigeamh caochladair FILE an còrr den loidhne. Mu dheireadh, tha am mac-talla mu dheireadh a’ sgrìobhadh 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 dùinte ann am fo-slige, toradh an luach $FILE thèid a sgrìobhadh gu caochladair VCL_FILE.

Mar a tha am beachd air loidhne 119 a’ moladh, tha seo a’ frithealadh an aon adhbhar a bhith a’ làimhseachadh chùisean gu h-earbsach far am bi an VCL a’ toirt iomradh air faidhlichean le caractaran geala nan ainmean.

Tha mi air iomradh a thoirt air an loidsig giollachd tùsail airson ${VCL_FILE} agus dh' fheuch e ri sreath nan àithntean atharrachadh, ach cha do lean sin gu ni sam bith. Dh'obraich a h-uile dad gu glan dhomh, agus a thaobh tòiseachadh air an t-seirbheis, thug e mearachd.

Tha e coltach nach gabh a’ mhearachd ath-riochdachadh nuair a thathar a’ ruith an sgriobt le làimh, fhad ‘s a tha na 30 mionaidean measta air tighinn gu crìch sia tursan mar-thà agus, a bharrachd air an sin, tha gnìomh prìomhachais nas àirde air nochdadh, a’ putadh a’ chòrr de na cùisean gu aon taobh. Bha an còrr den t-seachdain air a lìonadh le measgachadh de ghnìomhan agus cha robh e ach beagan air a lagachadh le òraid air sed agus agallamh leis an tagraiche. Duilgheadas mearachd ann an varnishreload air chall gu do-sheachanta ann an gainmheach ùine.

An sed-fu agad... da-rìribh... sgudal

Bha aon latha gu math saor an ath sheachdain, agus mar sin chuir mi romham an tiogaid seo a ghabhail a-rithist. Bha mi an dòchas nam eanchainn, gun robh cuid de phròiseas cùl-fhiosrachaidh fad na h-ùine seo a’ coimhead airson fuasgladh don duilgheadas seo, agus an turas seo tuigidh mi gu cinnteach dè tha ceàrr.

Leis an turas mu dheireadh cha do chuidich dìreach atharrachadh a’ chòd, chuir mi romhpa ath-sgrìobhadh a dhèanamh air a’ tòiseachadh bhon loidhne 116th. Ann an suidheachadh sam bith, bha an còd a th 'ann mar-thà gòrach. Agus gu dearbh chan eil feum air a chleachdadh read.

A’ coimhead air a’ mhearachd a-rithist:
sh: echo: broken pipe - anns an àithne seo, tha mac-talla ann an dà àite, ach tha amharas agam gur e a’ chiad fhear an neach a tha ciontach (gu math, no co-dhiù neach-taic). Chan eil awk a’ brosnachadh misneachd nas motha. Agus air eagal gu bheil e dha-rìribh awk | {read; echo} tha an dealbhadh a 'leantainn gu na duilgheadasan sin uile, carson nach cuir thu an àite e? Chan eil an àithne aon-loidhne seo a’ cleachdadh a h-uile feart de awk, agus eadhon an rud a bharrachd seo read ann an eàrr-ràdh.

Bhon t-seachdain sa chaidh bha aithris air sedBha mi airson na sgilean ùra agam fheuchainn agus a dhèanamh nas sìmplidhe echo | awk | { read; echo} a-steach nas so-thuigsinn echo | sed. Ged nach e seo gu cinnteach an dòigh as fheàrr air a’ bhiast a ghlacadh, shaoil ​​​​mi gum feuchadh mi mo sed-fu co-dhiù agus is dòcha gun ionnsaich mi rudeigin ùr mun duilgheadas. Air an t-slighe, dh’ iarr mi air mo cho-obraiche, an sgrìobhadair còmhraidh sed, mo chuideachadh a’ tighinn suas le sgriobt sed nas èifeachdaiche.

Leig mi sìos an t-susbaint varnishadm vcl.show -v "$VCL_NAME" gu faidhle gus an urrainn dhomh fòcas a chuir air a bhith a’ sgrìobhadh an sgriobt sed gun dad sam bith den t-seirbheis ath-thòiseachadh.

Tuairisgeul goirid air dìreach mar a gheibhear cuir a-steach làmhan sed an leabhar-làimhe GNU aige. Anns na stòran sed, an samhla n air a shònrachadh gu soilleir mar dealaiche loidhne.

Ann an grunn bhealaich, agus le comhairle mo cho-obraiche, sgrìobh sinn sgriobt sed a thug an aon toradh ris an loidhne thùsail gu lèir 116.

Gu h-ìosal tha sampall faidhle le dàta 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 gheama.

# шаг первый, вывести только строки с комментариями
# используя возможности 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 bhiodh 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 geàrr-chunntas a dhèanamh air an loidsig gu h-àrd mar a leanas:
Ma tha sreang co-ionnan ri abairt àbhaisteach // VCL.SHOW, an uairsin caith gu sanntach an teacsa a tha a’ toirt a-steach an dà àireamh san loidhne sin, agus sàbhail na tha air fhàgail às deidh na h-obrach seo. Cuir a-mach an luach a tha air a stòradh agus cuir crìoch air a’ phrògram.

Simple, nach e?

Bha sinn toilichte leis an sgriobt sed agus leis gu bheil e a’ dol an àite a’ chòd thùsail gu lèir. Thug na deuchainnean agam uile na toraidhean a bha a dhìth, agus mar sin dh'atharraich mi an "varnishreload" air an fhrithealaiche agus ruith mi a-rithist systemctl reload varnish. Mearachd salach echo: write error: Broken pipe gàire 'nar n-aghaidh a rìs. Bha cursair winking a’ feitheamh ri òrdugh ùr a chuir a-steach ann am beàrn dorcha an uidheim...

Source: www.habr.com

Cuir beachd ann