Ku Dhaca Godka Bakaylaha: Sheekada Mid ka mid ah Dib u Celinta Varnish - Qaybta 1

ghostinushanka, isagoo 20-kii daqiiqo ee hore ku garaacayay badhamada sidii inay noloshiisu ku xidhan tahay, ayaa igu soo jeestay isagoo indho duur-joog ah indhihiisa ku jira oo dhoola cadeynaya - "Saaxiib, waxaan u maleynayaa inaan helay."

"Halkan u fiirso," ayuu yidhi, isaga oo tilmaamaya mid ka mid ah calaamadaha shaashadda, "Waxaan ku sharadiyey koofiyaddayda cas in haddii aan halkan ku daro waxa aan hadda ku soo diray," isaga oo tilmaamaya qayb kale oo kood ah, "khaladku ma sii ahaan doono waa la soo bandhigi doonaa."

In yar oo yaaban oo daalan, ayaan wax ka beddelay odhaahdii aan in muddo ah ku shaqaynaynay, kaydi faylka oo orod. systemctl varnish reload. Fariinta khaladka ah waa la waayay...

"Emailladii aan isweydaarsaday musharraxa," saaxiibkay wuu sii waday, isagoo dhoola cadeynaya farxad dhab ah, "Waxay si lama filaan ah iigu soo baxday in tani ay tahay isla dhibaatada!"

Siday ku bilaabmeen

Maqaalku wuxuu qaadanayaa fahamka sida bash, awk, sed iyo habaysan u shaqeeyaan. Aqoonta varnish ayaa la door bidaa, laakiin looma baahna.
Jadwalka wakhtiyada godadka waa la bedelay.
Lagu qoray ghostinushanka.
Qoraalkani waa tarjumaad asal ah oo lagu daabacay Ingiriisi laba toddobaad ka hor; turjumaada boikoden.

Qorraxdu waxay ka soo iftiimaysaa daaqadaha daaqadaha ee subax kale oo diiran, koob cabitaan qani ah oo kaafiyaan ah oo dhawaan la diyaariyey ayaa ka fogaanaya kiiboodhka, dhawaaqa codka aad ugu jeceshahay ee taleefannadaada, isaga oo qarqaya qulqulka kiiboodhka farsamada, iyo gelitaanka ugu horreeya Liiska tigidhada dib-u-celinta ee sabuuradda Kanban waxay si ciyaareysan u dhalaalaysaa ciwaanka masiiriga ah "Baari varnishreload" sh: echo: I/O qaladka habaynta" (Baari "varnishreload sh: echo: I/O error" Marka ay timaado varnish, waxaa jira oo aan noqon karin meel kasta oo qalad ah, xitaa haddii ayan keenin wax dhibaato ah sida kiiskan.

Kuwa aan aqoon u lahayn varnishreload, kani waa qoraal fudud oo qolof ah oo loo isticmaalo dib-u-dejinta qaabaynta varnish - sidoo kale loo yaqaan VCL.

Sida cinwaanka tigidhku soo jeedinayo, qaladku wuxuu ku dhacay mid ka mid ah server-yada masraxa, iyo tan iyo markii aan hubiyay in marin-u-socodka varnish ee masraxa uu si sax ah u shaqeynayo, waxaan u qaatay in tani ay noqon doonto qalad yar. Markaa, kaliya fariin ku dhammaatay qulqulka wax soo saarka ee hore u xidhnaa. Waxaan tigidhka u qaataa naftayda, anigoo kalsooni buuxda ku qaba inaan diyaar u yahay in aan wax ka yar 30 daqiiqo ku calaamadiyo, dhabarka isku salaaxo si aan qashinka kale uga nadiifiyo guddiga oo aan ku laabto arrimo kale oo muhiim ah.

Darbiga ku dhacaya 200 km/h

Furitaanka faylka varnishreload, Mid ka mid ah server-yada ku shaqeeya Debian Stretch, waxaan ku arkay qoraal qolof ah oo ka yar 200 oo sadar.

Markii aan soo maray qoraalka, ma aanan dareemin wax ka dhalan kara dhibaatooyin marka dhowr jeer si toos ah uga socdo terminalka.

Ka dib oo dhan, tani waa marxalad, xitaa haddii ay jabto, qofna ma caban doono, si fiican ... ma badna. Waxaan maamulaa qoraalka oo aan arko waxa lagu qori doono terminalka, laakiin khaladaadku hadda ma muuqdaan.

Lamaane kale ayaa ordaya si ay u hubiyaan inaanan dib u soo saari karin qaladka iyada oo aan wax dadaal ah la helin, waxaanan bilaabayaa inaan ogaado sida loo beddelo qoraalkan oo aan u sameeyo weli qalad.

Qoraalku ma burin karaa STDOUT (adoo isticmaalaya > &-) Ama STDERR? Labadan midkoodna ma shaqayn dhammaadkii.

Sida muuqata habaysan ayaa si uun wax uga beddela jawiga bilowga, laakiin sidee, iyo sababtu?
Waxaan furay vim oo tafatir varnishreload, isagoo raaciyay set -x midigta hoosteeda shebang, rajaynaya in wax-soo-saarka cilladaha qoraalka ay iftiimin doonto xoogaa iftiin ah.

Faylka waa la saxay, markaa waxaan dib u soo celinayaa varnish oo waxaan arkay in isbeddelku gabi ahaanba jabiyay wax walba Xataa ku rogida terminaalka kuma filna in la helo meesha uu ka bilaabo. gabi ahaanba waan wareersanahay Habka wax-ka-daridda ma saameyn karaa hawlgalka barnaamijyada lagu bilaabay qoraalka? Maya, waa wax aan jirin. Kutaan qolofta ku jirta? Dhowr xaaladood oo suurtagal ah ayaa madaxayga ku tartamaya sida baranbaro jihooyin kala duwan u socda. Koobkii cabitaanka caffeine isla markiiba waa la faaruqiyay, safar degdeg ah oo jikada ah si loo buuxiyo kaydka iyo ... waan tagnaa. Waxaan furay qoraalka oo si dhow u fiirsada shebang: #!/bin/sh.

/bin/sh - kani waa calaamad kaliya oo loo yaqaan 'bash', markaa qoraalka waxaa lagu turjumay qaab ku habboon POSIX, sax? Sidaas maaha! Qolofka caadiga ah ee Debian waa dash, taasina waa sida ay u egtahay. waxaa loola jeedaa /bin/sh.

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

Imtixaan ahaan, waxaan u beddelay shebangkii #!/bin/bash, la tirtiray set -x oo haddana isku dayay. Ugu dambeyntii, dib-u-kicinta ku xigta ee varnish, qalad loo dulqaadan karo ayaa ka soo muuqday wax soo saarka:

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

Sadarka 124, waa kan!

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 }

Laakiin sida ay soo baxday, line 124 waa mid madhan oo aan wax dan ah lahayn. Waxaan u qaadan karaa oo kaliya in qaladku uu dhacay qayb ka mid ah xargaha xargaha badan ee ka bilaabmaya line 116.
Maxaa ugu dambeyntii loo qoraa doorsoomiyaha? VCL_FILE iyada oo ay sabab u tahay fulinta qolof-hoosaadka sare?

Bilawga, waxay soo dirtaa waxa ku jira doorsoomaha VLC_SHOW, oo lagu sameeyay khadka 115, iyadoo raacaysa amarka tuubada. Kadibna maxaa halkaas ka dhacaya?

Marka hore, waxaa loo isticmaalaa halkaas varnishadm, taas oo qayb ka ah xirmada rakibaadda varnish, si loo dejiyo varnish iyada oo aan dib loo bilaabin.

Koox-hoosaad vcl.show -v loo isticmaalo in lagu soo saaro dhammaan qaabeynta VCL ee lagu qeexay ${VCL_NAME}, si ay u STDOUT.

Si aad u muujiso qaabka VCL ee firfircoon ee hadda jira, iyo sidoo kale dhowr nooc oo hore oo ah qaabaynta marinnada varnish ee wali ku jira xusuusta, waxaad isticmaali kartaa amarka varnishadm vcl.list, wax-soo-saarkoodu wuxuu la mid noqonayaa kan hoose:

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

Qiimaha isbedbeddelaya ${VCL_NAME} waxaa lagu rakibay qayb kale oo qoraalka ah varnishreload Magaca VCL-ga hadda firfircoon, haddii uu jiro. Xaaladdan oo kale waxay noqon doontaa "dib-u-load_20190101_120000_12397".

Wayn, doorsoome ${VCL_SHOW} ka kooban qaabeynta dhamaystiran ee varnish, cad hadda. Hadda waxaan ugu dambeyntii fahmay sababta wax-soo-saarka dashku yahay set -x Waxay u soo baxday inay si aad ah u jabtay - waxay ku jirtay nuxurka qaabeynta natiijada.

Waxaa muhiim ah in la fahmo in qaabeynta VCL-ka oo dhameystiran inta badan laga soo wada ururin karo dhowr fayl. Faallooyinka C-style waxaa loo isticmaalaa in lagu aqoonsado meelaha faylalka qaabeynta qaarkood lagu daray kuwa kale, taasina waa waxa xariiqda soo socota ee koodka jajabku ku saabsan yahay.
Ereyga faallooyinka ee sharraxaya faylasha lagu daray waa qaabkan soo socda:

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

Tirooyinka muhiim maaha marka la eego macnaha guud, waxaan xiiseyneynaa magaca faylka.

Maxaa aakhirka ka dhacaya qulqulka amarada ka bilaabma khadka 116?
Aan aragno.
Kooxdu waxay ka kooban tahay afar qaybood:

  1. Wax fudud echo, kaas oo daabaca qiimaha doorsoomayaasha ${VCL_SHOW}
    echo "$VCL_SHOW"
  2. awk, kaas oo raadinaya xariiq (diiwaan) meesha ugu horeysa, ka dib jebinta qoraalka, waa "//", ka labaadna waa "VCL.SHOW".
    Awk waxa uu qori doonaa xariiqda kowaad ee u dhigma qaababkan ka dibna waxa uu isla markiiba joojin doonaa habaynta.

    awk '$1 == "//" && $2 == "VCL.SHOW" {print; exit}'
  3. Qayb kood ah oo kaydisa qiyamka goobta shan doorsoomayaal, oo ay u kala baxaan meelo bannaan. Doorsoomaha FILE ee shanaad wuxuu helayaa inta ka hartay khadka. Ugu dambeyntii, dhawaaqa ugu dambeeya ayaa qoraya waxa ku jira doorsoomaha ${FILE}.
    { read -r DELIM VCL_SHOW INDEX SIZE FILE; echo "$FILE" }
  4. Maadaama dhammaan tillaabooyinka 1 ilaa 3 ay ku jiraan qolof hoose, oo soo saaraysa qiimaha $FILE waxaa loo qori doonaa doorsoome VCL_FILE.

Sida faallooyinka xariiqda 119 ay soo jeedinayso, tani waxay u adeegaysaa ujeedada kaliya ee ah in si la isku halleyn karo loo maareeyo kiisaska halkaas oo VCL ay tixraaci doonto faylalka boosaska magacyadooda ku yaal.

Waxaan ka faallooday macquulka habaynta asalka ah ee loogu talagalay ${VCL_FILE} oo isku dayay inuu beddelo nidaamka amarka, laakiin waxba uma horseedin. Wax walba si fiican ayey iigu shaqeeyeen, laakiin markii aan bilaabay adeegga waxay bixisay qalad.

Waxay u muuqataa in qaladku aanu si fudud dib u soo saari karin marka qoraalka gacanta lagu hayo, halka 30-kii daqiiqo ee la malaynayay ay hore u dhaafeen lix jeer, marka lagu daro, hawl mudnaan sare leh ayaa soo baxday, iyada oo la riixayo arrimo kale. Todobaadka intiisa kale waxaa soo buux dhaafiyay howlo kala duwan waxaana kaliya lagu milmay warbixin ku saabsan sed iyo wareysi musharax. Dhibaatada qaladka varnishreload ayaa si aan la soo koobi karin loogu lumay bacaadka waqtiga.

Waxa loogu yeero sed-fu... dhab ahaantii waa... qashin

Usbuuca xiga waxaan haystay hal maalin oo xor ah, sidaa darteed waxaan go'aansaday inaan mar kale wax ka qabto tigidhkan. Waxaan rajaynayay in maskaxdayda, nidaamka asalka ah ay raadinayeen xal dhibaatadan oo dhan waqtigan oo dhan, iyo markan hubaal waxaan fahmi lahaa waxa socda.

Maadaama si fudud u beddelka koodka aanu caawinayn waqtigii ugu dambeeyay, waxaan go'aansaday inaan dib u qoro anigoo ka bilaabaya safka 116. Si kastaba ha ahaatee, koodhka jira wuxuu ahaa nacas. Oo gabi ahaanba looma baahna in la isticmaalo read.

Isagoo mar kale eegaya qaladka:
sh: echo: broken pipe - Echo ayaa ka muuqata laba meelood oo amarkan ah, laakiin waxaan ka shakisanahay in kan ugu horreeya uu yahay dembiilaha ugu badan (ama ugu yaraan gacan-ku-dhiigle). Awk sidoo kale ma dhiirigelinayo kalsoonida. Iyo haddii ay dhacdo in ay dhab ahaantii tahay awk | {read; echo} naqshaddu waxay keenaysaa dhammaan dhibaatooyinkan, maxaad u beddeli weyday? Amarka hal-line ma isticmaalo dhammaan sifooyinka awk, iyo xitaa kan dheeraadka ah read waxaa dheer.

Tan iyo todobaadkii hore waxaa jiray warbixin ku saabsan sed, Waxaan rabay in aan tijaabiyo xirfadahayga cusub oo aan fududeeyo echo | awk | { read; echo} galay wax badan oo la fahmi karo echo | sed. Inkastoo tani aysan xaqiiqdii ahayn habka ugu wanaagsan ee lagu aqoonsan karo cayayaanka, waxaan u maleeyay inaan ugu yaraan isku dayi lahaa sed-fuyga oo laga yaabo inaan wax cusub ka barto dhibaatada. Intii aan jidka ku jiray, waxaan ka codsaday saaxiibkay, qoraaga sheekada sed-ka, inuu iga caawiyo inaan la imaado qoraal sed ah oo hufan.

Wixii ku jiray ayaan tuuray varnishadm vcl.show -v "$VCL_NAME" fayl, si aan diiradda u saaro qorista qoraalka sed-ka ah iyada oo aan wax dhib ah u gelin dib-u-bilaabista adeegga.

Sharaxaad gaaban oo ku saabsan sida saxda ah ee hab-socodka sed-ku-gelinta looga heli karo buuggiisa GNU. In ilaha seed calaamadda n si cad loo qeexay sida khadadka kala soocida.

Marar dhowr ah iyo talooyinka saaxiibkay, waxaan ku qornay qoraal sed ah oo bixiyay natiijo la mid ah dhammaan sadarkii asalka ahaa ee 116.

Hoos waxaa ku yaal fayl muunad ah oo leh xog gelinta:

> 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

Tani waxaa laga yaabaa inaysan ka muuqan sharraxaadda kore, laakiin waxaan xiiseyneynaa kaliya faallooyinka ugu horreeya // VCL.SHOW, waxaana laga yaabaa inay dhowr ka mid ah ku jiraan xogta gelinta. Tani waa sababta awk asalka ahi u dhamaado ciyaarta koowaad ka dib.

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

Marka, waxa ku jira qoraalka varnishreload waxay u ekaan doonaan sidan:

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

Caqliga sare wuxuu si kooban u qeexi karaa sidan.
Haddii xadhiggu ku habboon yahay tibaaxaha caadiga ah // VCL.SHOW, ka dibna hunguri ka cun qoraalka ay ku jiraan labada lambar ee sadarkan, oo kaydi wax kasta oo hadha qalliinkan ka dib. Soo saar qiimaha kaydsan oo jooji barnaamijka.

Fudud, miyaanay ahayn?

Waxaan ku faraxsanahay qoraalka sed iyo xaqiiqda ah in ay bedeshay dhammaan koodka asalka ah. Dhammaan imtixaanadeyda waxay bixiyeen natiijooyinkii la rabay, markaa waxaan bedelay "varnishreload" ee server-ka oo mar labaad ku orday systemctl reload varnish. Khalad xun echo: write error: Broken pipe ayaa mar kale wajiyadayada ka qoslay. Cursor-ga lulaya waxa uu sugayay amar cusub in la soo galiyo mugdiga mugdiga ah ee terminalka...

Source: www.habr.com

Add a comment