Mianjera amin'ny lavaka bitro: Ny tantaran'ny fahadisoana reboot varnish iray - Fizarana 1

Ghostinushanka, rehefa avy nandondona ny bokotra nandritra ny 20 minitra teo aloha toy ny hoe miankina amin'izany ny ainy, dia nitodika tamiko tamin'ny fomba fijery semi-wild teo amin'ny masony sy ny tsiky manjavozavo - "Dude, heveriko fa azoko."

"Jereo eto," hoy izy, nanondro ny iray amin'ireo tarehin-tsoratra teo amin'ny efijery, "Matoky aho fa raha ampidirintsika eto izay nalefako anao" - nanondro ny ampahany amin'ny fehezan-dalàna hafa - "tsy misy intsony ny fahadisoana. haseho."

Somary sahiran-tsaina sy reraka aho, ovaiko ny fanambarana sed izay niasanay nandritra ny fotoana kelikely, tehirizo ilay rakitra ary mihazakazaka. systemctl varnish reload. Nanjavona ny hafatra diso...

“Ireo mailaka nifanakalozako tamin’ilay kandidà,” hoy hatrany ilay mpiara-miasa tamiko, rehefa niova ho tsiky feno fifaliana ny tsiky feno hafaliana, “Tonga tao an-tsaiko tampoka fa mitovy ny olana!”

Ahoana no niantombohan'izany rehetra izany

Ny lahatsoratra dia mandray ny fahatakarana ny fomba fiasan'ny bash, awk, sed ary systemd. Ny fahalalana ny varnish no tiana fa tsy ilaina.
Novaina ny mari-pamantarana amin'ny snippet.
Nosoratana tamin'ny Ghostinushanka.
Ity lahatsoratra ity dia fandikana ny tany am-boalohany navoaka tamin'ny teny anglisy roa herinandro lasa izay; FANDIKAN-TENY boyikoden.

Ny masoandro dia miposaka amin'ny varavarankely manjavozavo amin'ny maraina mafana amin'ny fararano hafa, ny kaopy misy zava-pisotro misy kafeinina vao nokarakaraina dia mipetraka eo amin'ny sisin'ny fitendry, ny symphony ankafizin'ny feo mandeha amin'ny écouteur noho ny fikotrokotroky ny fitendry mekanika, ary ny fidirana voalohany amin'ny Ny lisitr'ireo tapakila miverina eo amin'ny solaitrabe kanban dia manjelanjelatra miaraka amin'ny lohateny mahafa-po hoe "Manadihady varnishreload sh: echo: I/O fahadisoana amin'ny fandaharana" (fanadihadiana "varnishreload sh: echo: I/O fahadisoana" amin'ny fandaharana). Raha resaka varnish dia tsy misy ary tsy mety hisy lesoka na dia tsy miteraka olana toy ny amin’ity tranga ity aza.

Ho an'ireo izay tsy mahalala varnishreload, script akorandriaka tsotra ampiasaina hamerenana ny fandrindrana varnish - antsoina koa hoe VCL.

Araka ny voalazan'ny lohatenin'ny tapakila dia nisy ny hadisoana tamin'ny iray amin'ireo mpizara teo amin'ny lampihazo, ary satria natoky aho fa mandeha tsara ny lalan'ny varnish amin'ny sehatra, dia nihevitra aho fa fahadisoana kely izany. Noho izany, hafatra fotsiny izay niditra tao amin'ny stream output efa mihidy. Maka tapakila ho an'ny tenako aho, amin'ny fahatokiana tanteraka fa hanisy marika azy ho vonona ao anatin'ny 30 minitra latsaka aho, hikapoka ny soroka amin'ny fanadiovana ny solaitrabe amin'ny fako manaraka ary hiverina amin'ny zavatra manan-danja kokoa.

Nidona tamin’ny rindrina tamin’ny hafainganam-pandeha 200 km/ora

Manokatra rakitra varnishreload, tao amin'ny iray amin'ireo mpizara mihazakazaka Debian Stretch, dia nahita script akorandriaka latsaky ny 200 andalana aho.

Raha nihazakazaka tamin'ny script aho dia tsy nahita na inona na inona mety hiteraka olana rehefa mihazakazaka imbetsaka mivantana avy amin'ny terminal aho.

Izany rahateo no sehatra, na dia tapaka aza, tsy hisy hitaraina, eny... tsy be loatra. Mihazakazaka ny script aho ary mijery izay hosoratana amin'ny terminal, saingy tsy hita intsony ny fahadisoana.

Mihazakazaka bebe kokoa ny mpivady mba hahazoana antoka fa tsy afaka mamerina ilay fahadisoana aho raha tsy misy ezaka fanampiny, ary manomboka mieritreritra ny fomba hanovana ity script ity aho ary hanao izany mbola hanipy fahadisoana.

Afaka manakana ny STDOUT ve ny script (mampiasa > &-)? Sa STDERR? Samy tsy niasa tamin'ny farany.

Mazava ho azy fa ny systemd dia manova ny tontolo iainana amin'ny fomba sasany, fa ahoana ary nahoana?
Mandeha vim aho ary manitsy varnishreload, manampy set -x eo ambanin'ny shebang, manantena fa ny debugging ny famoahana ny script dia hanome hazavana kely.

Ny rakitra dia raikitra, ka namerina varnish aho ary hitako fa ny fanovana dia nanimba tanteraka ny zava-drehetra ... Ny setroka dia korontana tanteraka, misy kaody C toy ny C ao anatiny. Na ny scrolling ao amin'ny terminal aza dia tsy ampy hahitana hoe aiza no manomboka. Very hevitra tanteraka aho. Mety hisy fiantraikany amin'ny asan'ny programa mandeha amin'ny script ve ny maody debug? Tsia, omby. Bug ao anaty akorany? Toe-javatra maro azo atao no manidina ao an-dohako toy ny kalalao amin'ny lalana samihafa. Esory avy hatrany ny kaopy misy kafeinina feno, fitsangatsanganana haingana any an-dakozia mba hamelomana indray ary… andao. Sokafy ny script aho ary mijery akaiky ny shebang: #!/bin/sh.

/bin/sh - Symlink bash fotsiny io, ka ny script dia adika amin'ny fomba mifanaraka amin'ny POSIX, sa tsy izany? Tsy teo ilay izy! Ny shell default amin'ny Debian dia dash, izay tena izy milaza /bin/sh.

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

Ho fitsaràna dia novana ny shebang ho #!/bin/bash, voafafa set -x ary nanandrana indray. Farany, tamin'ny famerenana indray ny varnish, dia nisy hadisoana azo leferina niseho tao amin'ny vokatra:

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

Andalana 124, indro!

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 }

Saingy ny zava-misy dia ny andalana 124 dia tsy misy dikany ary tsy mahaliana. Azoko eritreretina fotsiny fa ny hadisoana dia nitranga tamin'ny ampahany amin'ny multiline manomboka amin'ny andalana 116.
Inona no nosoratana tamin'ny farany VCL_FILE vokatry ny fanatanterahana ny zana-akoraly etsy ambony?

Eo am-piandohana dia mandefa ny votoatin'ny variable izy io VLC_SHOW, noforonina tamin'ny andalana 115, mankany amin'ny baiko manaraka amin'ny alàlan'ny fantsona. Ary inona no mitranga any?

Voalohany, mampiasa izany varnishadm, izay ampahany amin'ny fonosana fametrahana varnish, mba hanitsiana varnish nefa tsy manomboka.

subcommand vcl.show -v dia ampiasaina hamoahana ny fandrindrana VCL manontolo voalaza ao ${VCL_NAME}, mankany STDOUT.

Mba hampisehoana ny fandrindrana VCL mavitrika amin'izao fotoana izao ary koa ny dikan-teny maromaro teo aloha amin'ny fandrindrana lalana varnish izay mbola ao anaty fitadidiana, dia azonao atao ny mampiasa ny baiko. varnishadm vcl.list, ny vokatra azo dia hitovy amin'ireto manaraka ireto:

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

Sanda miovaova ${VCL_NAME} apetraka amin'ny ampahany hafa amin'ny script varnishreload amin'ny anaran'ny VCL mavitrika amin'izao fotoana izao, raha misy. Amin'ity tranga ity dia ho "reload_20190101_120000_12397".

Okay, variable. ${VCL_SHOW} misy ny configuration feno ho an'ny varnish, mazava tsara hatreto. Ankehitriny dia azoko ihany ny antony mahatonga ny dash output amin'ny set -x nivadika ho tapaka be - tafiditra ao anatin'izany ny atiny amin'ny fanamafisana vokatr'izany.

Zava-dehibe ny mahatakatra fa ny fanamafisana VCL feno dia matetika azo atambatra amin'ny rakitra marobe. Ny fanehoan-kevitra amin'ny fomba C dia ampiasaina hamaritana hoe aiza no nampidirina ny rakitra fanamafisana iray amin'ny iray hafa, ary izany indrindra no resahin'ity tsipika manaraka ity.
Ny syntax ho an'ny fanehoan-kevitra manoritsoritra ny rakitra tafiditra dia manana endrika manaraka ireto:

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

Ny isa amin'ity toe-javatra ity dia tsy zava-dehibe, liana amin'ny anaran'ny rakitra izahay.

Ka inona no mitranga amin'ny honahona amin'ny baiko manomboka amin'ny andalana 116?
Andao hojerentsika.
Misy ampahany efatra ny baiko:

  1. tsotra echo, izay mampiseho ny sandan'ny variable ${VCL_SHOW}
    echo "$VCL_SHOW"
  2. awk, izay mitady tsipika (rakitra), ka ny saha voalohany, rehefa avy mizara ny lahatsoratra, dia ho “//”, ary ny faharoa dia “VCL.SHOW”.
    Awk dia hanoratra ny andalana voalohany mifanandrify amin'ireo lamina ireo ary avy eo dia hijanona avy hatrany ny fanodinana.

    awk '$1 == "//" && $2 == "VCL.SHOW" {print; exit}'
  3. Boky kaody mitahiry ny sandan'ny saha amin'ny fari-piainana dimy, misaraka amin'ny habaka. Ny fiovaovana fahadimy FILE dia mandray ny sisa amin'ny andalana. Farany, ny ako farany dia manoratra ny votoatin'ny fari-piainana ${FILE}.
    { read -r DELIM VCL_SHOW INDEX SIZE FILE; echo "$FILE" }
  4. Koa satria ny dingana 1 ka hatramin'ny 3 rehetra dia voahidy ao anaty akorandriaka iray, ny fivoahan'ny sandany $FILE dia hosoratana amin'ny variable VCL_FILE.

Araka ny soso-kevitry ny fanehoan-kevitra ao amin'ny andalana 119, io no tanjona tokana amin'ny fitantanana azo itokisana ireo tranga izay hanondroan'ny VCL ireo rakitra misy tarehintsoratra fotsy amin'ny anarany.

Naneho hevitra momba ny lojika fanodinana tany am-boalohany aho ${VCL_FILE} ary niezaka nanova ny filaharan'ny baiko, nefa tsy nitondra na inona na inona. Niasa tsara ho ahy ny zava-drehetra, ary raha nanomboka ny serivisy dia nisy fahadisoana.

Toa tsy azo averina tsotra izao ny hadisoana rehefa mampandeha ny script amin'ny tanana, fa ny 30 minitra tombanana dia efa nifarana in-enina ary, ankoatra izany, dia nisy asa laharam-pahamehana ambony kokoa, nanosika ny ambiny amin'ny raharaha. Ny herinandro sisa dia feno asa isan-karazany ary nalevina kely fotsiny tamin'ny lahateny momba ny sed sy ny tafatafa nifanaovana tamin'ny kandidà. Olana diso in varnishreload very tsy azo averina ao anatin'ny fasika.

Ny lazainao hoe sed-fu... raha ny marina... fako

Ny herinandro nanaraka dia nanana andro iray tena malalaka, ka nanapa-kevitra ny haka ity tapakila ity indray aho. Nanantena aho fa tao amin'ny ati-dohako, nisy dingana ambadika nandritra izany fotoana izany nitady vahaolana amin'ity olana ity, ary amin'ity indray mitoraka ity dia ho azoko tsara ny tsy mety.

Satria tsy nanampy tamin'ny fanovana ny kaody farany teo, nanapa-kevitra ny hamerina hanoratra azy aho manomboka amin'ny andalana faha-116. Na izany na tsy izany, ny kaody efa misy dia hadalana. Ary tena tsy ilaina ny mampiasa read.

Mijery ny fahadisoana indray:
sh: echo: broken pipe - Amin'ity baiko ity dia misy toerana roa ny echo, saingy miahiahy aho fa ny voalohany no mety ho meloka (tsara, na farafaharatsiny mpiray tsikombakomba). Awk koa tsy manentana ny fahatokisan-tena. Ary raha sanatria tena misy izany awk | {read; echo} ny famolavolana dia mitarika ireo olana rehetra ireo, maninona raha soloina? Ity baiko tokana ity dia tsy mampiasa ny endri-javatra rehetra amin'ny awk, ary na dia ity fanampiny ity aza read amin'ny appendage.

Nanomboka tamin'ny herinandro lasa dia nisy ny tatitra momba ny sedTe hanandrana ny fahaizako vao azoko aho ary hanatsotra echo | awk | { read; echo} ho azo takarina kokoa echo | sed. Na dia tsy izany aza no fomba tsara indrindra hisambotra ilay bibikely, dia nieritreritra aho fa hanandrana farafaharatsiny ny sed-fu ary mety hianatra zava-baovao momba ilay olana. Teny an-dalana dia nangataka ny mpiara-miasa amiko aho, ilay mpanoratra sed talk, mba hanampy ahy hamorona script sed mahomby kokoa.

Nariako ny atiny varnishadm vcl.show -v "$VCL_NAME" amin'ny rakitra iray mba hahafahako mifantoka amin'ny fanoratana ny script sed tsy misy olana amin'ny fanombohana ny serivisy.

Famaritana fohy momba ny fomba itondran'ny sed ny fidirana dia hita ao ny bokiny GNU. Ao amin'ny loharano sed, ny marika n voatondro mazava ho mpanasa-dalana.

Tao anatin'ny dingana maromaro, ary noho ny torohevitry ny mpiara-miasa amiko, dia nanoratra script sed izahay izay nanome vokatra mitovy amin'ny andalana 116 tany am-boalohany manontolo.

Ity ambany ity ny rakitra santionany misy angona fampidirana:

> 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

Mety tsy miharihary amin'ny famaritana etsy ambony izany, fa ny fanehoan-kevitra voalohany ihany no mahaliana antsika // VCL.SHOW, ary mety misy maromaro amin'izy ireo ao amin'ny angona fampidirana. Izany no mahatonga ny awk voalohany hifarana aorian'ny lalao voalohany.

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

Ka ny ao anatin'ny script varnishreload dia toa izao:

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

Ny lojika etsy ambony dia azo fintinina toy izao:
Raha mifanaraka amin'ny fiteny mahazatra ny tady // VCL.SHOW, dia laniny am-pieremana ny lahatsoratra misy isa roa ao amin'io andalana io, ary tehirizo izay sisa tavela aorian'io asa io. Avoahy ny sanda voatahiry ary farano ny programa.

Tsotra, sa tsy izany?

Faly izahay tamin'ny script sed sy ny fanoloana ny code voalohany rehetra. Ny fitsapana rehetra nataoko dia nanome ny valiny irina, ka nanova ny "varnishreload" tao amin'ny server aho ary nihazakazaka indray systemctl reload varnish. Fahadisoana maloto echo: write error: Broken pipe nihomehy teo aminay indray. Nisy cursor mikipitika miandry baiko vaovao hampidirina ao anatin'ny banga maizina amin'ny terminal...

Source: www.habr.com

Add a comment