Kugwa Pansi pa Bowo la Kalulu: Nkhani ya cholakwika chimodzi choyambitsanso varnish - Gawo 1

ghostinushanka, atakhala akugwedeza mabatani kwa mphindi 20 zapitazo ngati kuti moyo wake umadalira, akutembenukira kwa ine ndi maso ake osawoneka bwino komanso mochenjera - "Bwanawe, ndikuganiza kuti ndapeza."

“Taonani apa,” iye akutero, akuloza chimodzi mwa zizindikiro zimene zili pa zenera, “Ndikubetchera chipewa changa chofiyira kuti tikawonjezera apa chimene ndangokutumizirani,” akulozera ku gawo lina la code, “cholakwa sichidzakhalanso. zidzawonetsedwa."

Ndikudabwa pang'ono komanso kutopa, ndikusintha mawu omwe takhala tikugwira nawo kwakanthawi, sungani fayilo ndikuyendetsa systemctl varnish reload. Uthenga wolakwika wasowa...

"Maimelo omwe ndinasinthana ndi munthu wosankhidwayo," mnzangayo anapitiriza, pamene kusekerera kwake kunakula kukhala kumwetulira kwenikweni kwachisangalalo, "Zinanditulukira mwadzidzidzi kuti ili ndi vuto lomweli!"

Momwe zidayambira

Nkhaniyi ikuwonetsa kumvetsetsa momwe bash, awk, sed ndi systemd zimagwirira ntchito. Kudziwa za varnish ndizokonda, koma osafunikira.
Zidindo zanthawi mu timawu tasinthidwa.
Wolemba ndi ghostinushanka.
Malembawa ndi omasulira omwe adasindikizidwa mu Chingerezi masabata awiri apitawo; kumasulira bokoden.

Dzuwa likuwalira m'mazenera owoneka bwino m'mawa wina wotentha wa m'dzinja, kapu yachakumwa chokoma kwambiri cha caffeine imakhala kutali ndi kiyibodi, mawu omwe mumakonda amamveka m'mahedifoni anu, ndikumiza chiwombankhanga cha kiyibodi yamakina, ndikulowa koyamba. pamndandanda wa matikiti otsalira pa bolodi ya Kanban ikuwoneka bwino ndi mutu wowopsa "Fufuzani kulongedzanso varnish" sh: echo: I/O zolakwika pakupanga" (Fufuzani "varnishreload sh: echo: I/O cholakwika" popanga). Pankhani ya varnish, pali ndipo sipangakhale malo olakwika, ngakhale sizingabweretse mavuto monga momwe zilili pano.

Kwa omwe sadziwa kubwezeretsanso varnish, ichi ndi chipolopolo chosavuta chomwe chimagwiritsidwa ntchito pokonzanso kasinthidwe varnish - amatchedwanso VCL.

Monga momwe dzina la tikiti likusonyezera, cholakwikacho chinachitika pa imodzi mwa ma seva pa siteji, ndipo popeza ndinali wotsimikiza kuti njira ya varnish pa siteji ikugwira ntchito bwino, ndinaganiza kuti ichi chikanakhala cholakwika chaching'ono. Kotero, chabe uthenga umene unathera mu mtsinje watsekedwa kale linanena bungwe. Ndimadzitengera ndekha tikitiyo, ndili ndi chidaliro chonse kuti ndiilemba kuti yakonzeka pasanathe mphindi 30, ndidziguguda pamsana kuti ndichotse zinyalala zina ndikubwerera kuzinthu zofunika kwambiri.

Kugunda khoma pa liwiro la 200 km / h

Kutsegula fayilo varnishreload, pa imodzi mwama seva omwe akuthamanga Debian Stretch, ndinawona chipolopolo chocheperapo mizere ya 200 kutalika.

Nditadutsa mu script, sindinazindikire chilichonse chomwe chingabweretse mavuto mukachiyendetsa kangapo kuchokera pa terminal.

Pambuyo pake, iyi ndi siteji, ngakhale itasweka, palibe amene angadandaule, chabwino ... osati mochuluka. Ndimayendetsa script ndikuwona zomwe zidzalembedwe ku terminal, koma zolakwika sizikuwonekanso.

Enanso amathamanga kuti atsimikizire kuti sindingathe kubweza cholakwikacho popanda kuyesetsa kwina, ndipo ndikuyamba kudziwa momwe ndingasinthire script iyi ndikupangitsa kuti iphonyebe cholakwika.

Kodi script ikhoza kupitilira STDOUT (pogwiritsa ntchito > &-)? Kapena STDERR? Palibe mwa zonsezi chomwe chinagwira ntchito pamapeto pake.

Zikuwoneka kuti systemd mwanjira ina imasintha malo oyambira, koma bwanji, ndipo chifukwa chiyani?
Ndimatsegula vim ndikusintha varnishreload, kuwonjezera set -x pansi pa shebang, ndikuyembekeza kuti zotulukapo za script zidzawunikira.

Fayiloyo imakonzedwa, kotero ndikubwezeretsanso varnish ndikuwona kuti kusinthako kunathyola zonse ... Kuthako ndi chisokonezo chonse, momwe muli matani a C-code. Ngakhale kupukusa mu terminal sikokwanira kuti mupeze komwe kumayambira. Ndasokonezeka kwambiri. Kodi kukonza zolakwika kungakhudze magwiridwe antchito a script? Ayi, ndi zamkhutu. Vuto mu chipolopolo? Zochitika zingapo zomwe zingatheke zikudutsa m'mutu mwanga ngati mphemvu mbali zosiyanasiyana. Chikho cha chakumwa cha caffeine chimachotsedwa nthawi yomweyo, ulendo wofulumira wopita kukhitchini kukadzaza katundu ndi ... timapita. Ndimatsegula script ndikuyang'anitsitsa shebang: #!/bin/sh.

/bin/sh - ichi ndi symlink to bash, kotero script imatanthauziridwa mu POSIX-compatible mode, chabwino? Sichoncho! Chigoba chosasinthika pa Debian ndi dash, ndipo ndi momwe zimawonekera. amatanthauza /bin/sh.

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

Monga mayeso, ndinasintha shebang kukhala #!/bin/bash, zafufutidwa set -x ndipo anayesanso. Pomaliza, pambuyo poyambitsanso varnish, cholakwika chokhazikika chidawoneka pazotulutsa:

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

Mzere 124, ndi izi!

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 }

Koma momwe zimakhalira, mzere 124 ulibe kanthu ndipo alibe chidwi. Nditha kungoganiza kuti cholakwikacho chidachitika ngati gawo la mizere yambiri kuyambira pamzere 116.
Kodi pamapeto pake zalembedwa chiyani pakusintha? VCL_FILE chifukwa chochita chipolopolo chapamwambachi?

Poyambirira, imatumiza zomwe zili muzosintha VLC_SHOW, yopangidwa pa mzere wa 115, kutsatira lamulo kudzera pa chitoliro. Ndiyeno nchiyani chimachitika pamenepo?

Choyamba, imagwiritsidwa ntchito pamenepo varnishadm, yomwe ili gawo la phukusi loyika varnish, pokhazikitsa varnish popanda kuyambiranso.

Gulu laling'ono vcl.show -v amagwiritsidwa ntchito kutulutsa masinthidwe onse a VCL omwe afotokozedwamo ${VCL_NAME}, ku STDOUT.

Kuti muwonetse masanjidwe apano a VCL, komanso mitundu ingapo yam'mbuyomu ya masinthidwe a varnish omwe akadali pamtima, mutha kugwiritsa ntchito lamuloli. varnishadm vcl.list, zotsatira zake zidzakhala zofanana ndi zomwe zili pansipa:

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

Mtengo wosinthika ${VCL_NAME} imayikidwa mu gawo lina la script varnishreload ku dzina la VCL yomwe ikugwira ntchito pano, ngati ilipo. Pachifukwa ichi zikhala "reload_20190101_120000_12397".

Zabwino, zosinthika ${VCL_SHOW} ili ndi makonzedwe athunthu a varnish, omveka bwino pano. Tsopano ndimamvetsetsa chifukwa chake dash linanena bungwe set -x zidakhala zosweka kwambiri - zidaphatikizanso zomwe zasinthidwa.

Ndikofunika kumvetsetsa kuti kasinthidwe wathunthu wa VCL nthawi zambiri ukhoza kulumikizidwa pamodzi kuchokera ku mafayilo angapo. Ndemanga zamtundu wa C zimagwiritsidwa ntchito kuzindikira komwe mafayilo ena amasinthidwe aphatikizidwa ndi ena, ndipo ndizomwe mzere wotsatira wa code snippet umakhudza.
Mawu ofotokozera ndemanga omwe akuphatikizidwa ndi mafayilo ali motere:

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

Ziwerengero sizofunikira pankhaniyi, tili ndi chidwi ndi dzina lafayilo.

Kodi pamapeto pake chimachitika ndi chiyani m'dambo la malamulo kuyambira pamzere 116?
Tiyeni tiwone.
Gululi lili ndi magawo anayi:

  1. Zosavuta echo, zomwe zimasindikiza mtengo wa kusintha ${VCL_SHOW}
    echo "$VCL_SHOW"
  2. awk, yomwe imayang'ana mzere (mbiri) kumene gawo loyamba, mutaphwanya malemba, ndi "//", ndipo lachiwiri ndi "VCL.SHOW".
    Awk ilemba mzere woyamba wofananira ndi izi ndikusiya kukonza nthawi yomweyo.

    awk '$1 == "//" && $2 == "VCL.SHOW" {print; exit}'
  3. Chida cha code chomwe chimasunga magawo asanu mumitundu isanu, yolekanitsidwa ndi mipata. Mtundu wachisanu wa FILE umalandira mzere wonsewo. Pomaliza, echo yomaliza imalemba zomwe zili muzosintha ${FILE}.
    { read -r DELIM VCL_SHOW INDEX SIZE FILE; echo "$FILE" }
  4. Popeza masitepe onse 1 mpaka 3 atsekedwa mu subshell, kutulutsa mtengo $FILE zidzalembedwa ku variable VCL_FILE.

Monga ndemanga yomwe ili pamzere 119 ikuwonetsa, izi zimagwira ntchito yokhayo yosamalira milandu modalirika pomwe VCL imawonetsa mafayilo okhala ndi mipata m'maina awo.

Ndapereka ndemanga pazolinga zoyambira ${VCL_FILE} ndipo anayesa kusintha kutsatizana kwa lamulo, koma sikunatsogolere ku chirichonse. Chilichonse chinandiyendera bwino, koma nditayamba ntchitoyo idapereka cholakwika.

Zikuwoneka kuti cholakwikacho sichingabwerezedwenso mukamagwiritsa ntchito script pamanja, pomwe zomwe zikuyembekezeka kuti mphindi 30 zatha kale kasanu ndi kamodzi ndipo, kuwonjezera apo, ntchito yofunika kwambiri yawonekera, kukankhira pambali zinthu zina. Mlungu wonsewo unadzazidwa ndi ntchito zosiyanasiyana ndipo unangochepetsedwa pang'ono ndi lipoti la sed ndi kuyankhulana ndi wosankhidwa. Vuto ndi cholakwika mu varnishreload anali atatayika mosayembekezereka mumchenga wa nthawi.

Zomwe zimatchedwa sed-fu ... kwenikweni ... zinyalala

Mlungu wotsatira ndinali ndi tsiku limodzi laulere, kotero ndinaganiza zogulanso tikitiyi. Ndinkayembekezera kuti muubongo wanga, njira ina yakumbuyo yakhala ikuyang'ana njira yothetsera vutoli nthawi yonseyi, ndipo nthawi ino ndimvetsetsa zomwe zikuchitika.

Popeza kungosintha kachidindo sikunathandize nthawi yatha, ndidangoganiza zoilembanso kuyambira pamzere 116. Mulimonsemo, code yomwe inalipo inali yopusa. Ndipo palibenso chifukwa chogwiritsa ntchito read.

Kuyang'ananso cholakwika:
sh: echo: broken pipe - echo ikuwoneka m'malo awiri mu lamulo ili, koma ndikukayikira kuti woyamba ndiye woyambitsa (kapena wothandizana nawo). Awk sichilimbikitsanso chidaliro. Ndipo ngati izo ziridi awk | {read; echo} kamangidwe kameneka kamabweretsa mavuto onsewa, bwanji osasintha? Lamulo la mzere umodzi ili siligwiritsa ntchito mawonekedwe onse a awk, komanso owonjezera awa read kuphatikiza apo.

Kuyambira sabata yatha panali lipoti sed, ndinkafuna kuyesa luso langa latsopano ndi kufewetsa echo | awk | { read; echo} kumveka bwino echo | sed. Ngakhale iyi si njira yabwino yodziwira cholakwikacho, ndimaganiza kuti ndiyese sed-fu yanga ndipo mwina ndiphunzire china chatsopano pa vutoli. Ali m'njira, ndidafunsa mnzanga, yemwe adalemba sed talk, kuti andithandize kupanga sed script yogwira mtima kwambiri.

Ndasiya zomwe zili mkati varnishadm vcl.show -v "$VCL_NAME" ku fayilo, kotero ndimatha kuyang'ana kwambiri polemba sed script popanda vuto lililonse loyambitsanso ntchito.

Kufotokozera mwachidule momwe sed process zolowetsa zingapezeke mu buku lake la GNU. Mu sed magwero chizindikiro n zotchulidwa momveka bwino ngati cholekanitsa mizere.

M'magawo angapo komanso malingaliro a mnzanga, tidalemba sed script yomwe idapereka zotsatira zofanana ndi mzere wonse wa 116.

Pansipa pali chitsanzo cha fayilo yokhala ndi zolowetsa:

> 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

Izi sizingakhale zoonekeratu kuchokera kukufotokozera pamwambapa, koma timangokonda ndemanga yoyamba // VCL.SHOW, ndipo pakhoza kukhala angapo aiwo muzolowera. Ichi ndichifukwa chake awk yoyambirira imatha pambuyo pamasewera oyamba.

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

Chifukwa chake, zomwe zili mu varnishreload script ziziwoneka motere:

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

Mfundo yomwe ili pamwambayi ingathe kufotokozedwa mwachidule motere:
Ngati chingwecho chikufanana ndi mawu okhazikika // VCL.SHOW, kenaka mwadyera awononge malemba omwe ali ndi manambala onse awiri pamzerewu, ndikusunga zonse zomwe zatsala pambuyo pa opaleshoniyi. Tumizani mtengo wosungidwa ndikumaliza pulogalamuyo.

Zosavuta, sichoncho?

Tidakondwera ndi sed script komanso kuti idalowa m'malo mwa code yoyamba. Mayesero anga onse adapereka zotsatira zomwe ndikufuna, kotero ndidasintha "varnishreload" pa seva ndikuyiyendetsanso. systemctl reload varnish. Kulakwitsa koyipa echo: write error: Broken pipe anasekanso pamaso pathu. Cholozera choyang'ana maso chinali kuyembekezera kuti lamulo latsopano lilowe mumdima wopanda kanthu wa terminal...

Source: www.habr.com

Kuwonjezera ndemanga