"Tarisa pano," anodaro, achinongedza chimwe chezviratidzo pachiratidziri, "Ini ndinobheja ngowani yangu tsvuku kuti kana tikawedzera pano zvandabva kukutumira," achinongedzera kune chimwe chikamu chekodhi, "chikanganiso hachichave chiripo. zvicharatidzwa."
Kushamisika uye kuneta, ndinogadzirisa sed kutaura kwatave kushanda pairi kwechinguva, chengetedza faira uye mhanya. systemctl varnish reload
. Meseji yemhosho yanyangarika...
"Maemail andakachinjana nemukwikwidzi," wandaishanda naye akaenderera mberi, kunyemwerera kwake kwakakura kuita kunyemwerera kwechokwadi kwemufaro, "Zvakangoerekana zvauya kwandiri kuti ndiro dambudziko rimwe chete!"
Zvakatanga sei
Chinyorwa chinotora nzwisiso yekuti bash, awk, sed uye systemd inoshanda sei. Zivo yevarnish inosarudzwa, asi haidiwi.
Zvitampu zvenguva muzvidimbu zvakachinjwa.
Yakanyorwa ne
Ichi chinyorwa ishanduro yepakutanga yakatsikiswa muChirungu masvondo maviri apfuura; shanduro
Zuva rinopenya nepamahwindo epanoramic pane mamwe matsutso mangwanani anodziya, kapu yechinwiwa chichangobva kugadzirirwa chine caffeine inozorora kure nekhibhodi, symphony yako yaunofarira inonzwika mumahedhifoni ako, ichinyudza kunze ruzha rwemakanika kiyibhodhi, uye yekutanga kupinda. mune rondedzero yematikiti ekumashure pabhodhi reKanban rinopenya zvine runyoro zita rekuti "Ongorora varnishreload" sh: echo: I/O kukanganisa mukuronga" (Ongorora "varnishreload sh: echo: I/O kukanganisa" mukuita). Kana zvasvika kune varnish, pane uye haigone kuve nenzvimbo yekukanganisa, kunyangwe ikasaunza chero matambudziko senge mune ino kesi.
Kune vasina kujairana nazvo
Sezvo musoro wetikiti unoratidza, kukanganisa kwakaitika pane imwe yemaseva pachikuva, uye sezvo ndaiva nechokwadi chokuti varnish routing pachikuva yaishanda zvakanaka, ndakafunga kuti ichi chingava chikanganiso chiduku. Saka, meseji yakazoguma yatovharwa yakabuda. Ndinozvitorera tikiti racho, nechivimbo chakazara chokuti ndicharitara kuti ragadzirira mumaminiti asingasviki 30, ndinozvibata kumusana nokuda kwokubvisa rimwe marara mubhodhi ndodzokera kuzvinhu zvinokosha zvikuru.
Kurovera pamadziro pa200 km/h
Kuvhura faira varnishreload
, pane imwe sevha inomhanya Debian Stretch, ndakaona shell script isingasviki mitsara ye200 kureba.
Sezvo ndapfuura nepakati peiyo script, ini handina kuona chero chinhu chingakonzeresa matambudziko pakuimhanyisa kakawanda kubva kune terminal.
Mushure mezvose, iyi idanho, kunyange kana ikaputsika, hapana munhu achanyunyuta, zvakanaka ... kwete zvakanyanya. Ini ndinomhanyisa script ndoona zvichanyorwa kune terminal, asi zvikanganiso hazvichaoneki.
Mamwe akati wandei anomhanya kuti ave nechokwadi chekuti ini handikwanise kuburitsa chikanganiso pasina kumwe kuedza, uye ndiri kutanga kufunga kuti ndingachinje sei script uye kuita kuti irambe ichikanda chikanganiso.
Iyo script inogona kukunda STDOUT (uchishandisa > &-
)? Kana STDERR? Hapana chimwe cheizvi chakashanda pakupedzisira.
Sezviri pachena systemd neimwe nzira inogadzirisa nharaunda yekutanga, asi sei, uye nei?
Ini ndinovhura vim uye ndinogadzirisa varnishreload
, kuwedzera set -x
pasi peshebang, uchitarisira kuti debug kubuda kwe script kuchapa chiedza.
Iyo faira inogadziriswa, saka ndinoisazve varnish uye ndinoona kuti kuchinja kwacho kwakaputsa zvachose zvinhu zvose ... Kupera kusvibiswa kwakakwana, umo kune matani eC-like code. Kunyangwe kupuruzira muterminal hakuna kukwana kuwana kwainotangira. Ndakavhiringika chose. Ko debugging mode inogona kukanganisa kushanda kwezvirongwa zvakatangwa mune script? Kwete, hazvina maturo. Bug mugoko? Zviitiko zvinoverengeka zvinogoneka zviri kumhanya nemumusoro mangu semapete munzira dzakasiyana. Mukombe wewaini yekafeini inodururwa pakarepo, rwendo rwekukurumidza kuenda kukicheni kuti udzore mashizha uye ... toenda. Ndinovhura script uye ndinyatsotarisisa shebang: #!/bin/sh
.
/bin/sh
- iyi ingori symlink ku bash, saka script inodudzirwa muPOSIX-inoenderana modhi, handiti? Hazvina kudaro! Iyo yakasarudzika shell paDebian ndeye dash, uye ndizvo chaizvo zvazvinotaridzika. /bin/sh
.
# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Jan 24 2017 /bin/sh -> dash
Semuyedzo, ndakachinja shebang kuita #!/bin/bash
, dzadzimwa set -x
ndokuedza zvakare. Pakupedzisira, pakuzotangazve varnish, chikanganiso chinoshivirika chakaonekwa mune zvakabuda:
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
Mutsara 124, heunoi!
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 }
Asi sezvazvinozoitika, mutsara 124 hauna chinhu uye hauna kufarira. Ini ndaigona kungofungidzira kuti chikanganiso chakaitika sechikamu chetambo yakawanda inotangira pamutsetse 116.
Chii chinozopedzisira chanyorwa kune chinja? VCL_FILE
semhedzisiro yekuita iri pamusoro diki-shell?
Pakutanga, inotumira zviri mukati mekusiyana VLC_SHOW
, yakagadzirwa pamutsetse 115, ichitevera murairo kuburikidza nepombi. Zvino chii chinoitika ipapo?
Kutanga, inoshandiswa ipapo varnishadm
, iyo inhengo yevarnish yekuisa purogiramu, yekumisa varnish pasina kutangazve.
Sub-timu vcl.show -v
inoshandiswa kuburitsa iyo yese VCL kumisikidzwa yakatsanangurwa mukati ${VCL_NAME}
, ku STDOUT.
Kuti uratidze ikozvino inoshanda VCL kumisikidzwa, pamwe neanoverengeka yapfuura shanduro dzevarnish routing zvigadziriso zvichiri mundangariro, unogona kushandisa rairo. varnishadm vcl.list
, kubuda kwayo kunenge kwakafanana neiri pazasi:
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
Variable value ${VCL_NAME}
inoiswa mune chimwe chikamu chezvinyorwa varnishreload
kuzita reiyo VCL inoshanda, kana iripo. Muchiitiko ichi ichave "reload_20190101_120000_12397".
Yakakura, yakasiyana ${VCL_SHOW}
ine gadziriso yakakwana yevarnish, yakajeka ikozvino. Zvino ini pakupedzisira ndinonzwisisa kuti sei dash kubuda iri set -x
yakave yakatyoka zvakanyanya - yaisanganisira zviri mukati meiyo mhedzisiro yekugadzirisa.
Izvo zvakakosha kuti unzwisise kuti yakazara VCL kumisikidzwa inogona kazhinji kubatanidzwa kubva kune akati wandei mafaera. C-maitiro ekutaura anoshandiswa kuona uko mamwe mafaera ekugadzirisa akaverengerwa mune mamwe, uye ndozvinoita mutsara unotevera wekodhi snippet.
Iyo syntax yemashoko anotsanangura anosanganisirwa mafaera ari mune inotevera fomati:
// VCL.SHOW <NUM> <NUM> <FILENAME>
Nhamba hadzina kukosha mumamiriro ezvinhu aya, isu tinofarira zita refaira.
Chii chinozoitika mumatope emirairo kutanga pamutsetse 116?
Ngatizvionei.
Chikwata chine zvikamu zvina:
- Simple
echo
, iyo inodhinda kukosha kwekusiyana${VCL_SHOW}
echo "$VCL_SHOW"
awk
, iyo inotarisa mutsara (rekodhi) apo munda wekutanga, mushure mekuputsa zvinyorwa, "//", uye wechipiri "VCL.SHOW".
Awk inonyora mutsara wekutanga unoenderana neaya mapatani uye wobva wamira kugadzirisa nekukasira.awk '$1 == "//" && $2 == "VCL.SHOW" {print; exit}'
- Ibhuroka yekodhi inochengeta kukosha kwemunda muzvikamu zvishanu, zvakapatsanurwa nenzvimbo. Yechishanu FILE kusiyanisa inogamuchira yakasara yemutsetse. Chekupedzisira, maungira ekupedzisira anonyora zviri mukati memuchinjiko
${FILE}
.{ read -r DELIM VCL_SHOW INDEX SIZE FILE; echo "$FILE" }
- Sezvo matanho ese 1 kusvika ku3 akavharirwa mune subshell, achiburitsa kukosha
$FILE
zvichanyorwa kune chinjaVCL_FILE
.
Sekutaura kuri kuita mutsara 119, izvi zvinoshandira chinangwa chega chekubata nyaya dzakavimbika uko VCL ichataura mafaera ane nzvimbo mumazita avo.
Ini ndataura nezve yekutanga kugadzirisa logic ye ${VCL_FILE}
uye akaedza kushandura kutevedzana kwemirairo, asi hazvina kutungamira kune chero chinhu. Zvese zvakandiitira zvakanaka, asi pandakatanga sevhisi zvakapa kukanganisa.
Zvinoita sekuti mhosho haigone kudzokororwa kana uchimhanyisa script nemaoko, nepo maminitsi makumi matatu anofungidzirwa akatopera katanhatu uye, nekuwedzera, basa repamusoro rakaonekwa, richisundira zvimwe zvinhu parutivi. Zuva rose revhiki rakazadzwa nemabasa akasiyana-siyana uye rakangoderedzwa zvishoma nemushumo we sed uye kubvunzurudzwa nemunhu anenge asarudzwa. Dambudziko nekukanganisa mukati varnishreload
yakarasika zvisingagadzirisiki mujecha renguva.
Yako inonzi sed-fu ... chaizvoizvo ... marara
Vhiki rakatevera ndakava nezuva rimwe chete remahara, saka ndakafunga kubata tikiti iri zvakare. Ndaitarisira kuti muuropi hwangu, imwe nzira yekumashure yanga ichitsvaga mhinduro kudambudziko iri nguva yese iyi, uye panguva ino ndaizonyatsonzwisisa zvaiitika.
Sezvo kungochinja kodhi hakuna kubatsira nguva yekupedzisira, ndangofunga kuinyora zvakare kutanga kubva pamutsetse 116. Chero zvazvingava, kodeti yaivapo yakanga yakapusa. Uye hapana zvachose chikonzero chekuishandisa read
.
Kutarisa kukanganisa zvakare:
sh: echo: broken pipe
- echo inoonekwa munzvimbo mbiri mune uyu murairo, asi ndinofungidzira kuti wekutanga ndiye angangove ane mhosva (kana angangoita mubatsiri). Awk haikurudzire chivimbo zvakare. Uye kana zviri izvo chaizvo awk | {read; echo}
dhizaini inotungamirira kumatambudziko ose aya, wadii kuitsiva? Uyu mutsara-mutsetse haushandise ese maficha eawk, uye kunyangwe iyi yekuwedzera read
pamusoro pe.
Kubva last week paive ne report on sed
, ndaida kuedza unyanzvi hwangu huchangobva kuwanwa ndokurerutsa echo | awk | { read; echo}
mune imwe inonzwisisika echo | sed
. Kunyange iyi isiri iyo nzira yakanakisa yekuziva iyo bug, ndakafunga kuti ndimboedza sed-fu yangu uye pamwe ndidzidze chimwe chinhu chitsva nezve dambudziko. Ndiri munzira, ndakakumbira wandaishanda naye, munyori we sed talk, kuti andibatsire kuunza sed script inoshanda zvakanyanya.
Ndakadonhedza zvaiva mukati varnishadm vcl.show -v "$VCL_NAME"
kune faira, saka ndaigona kutarisa kunyora sed script pasina kunetsekana kwesevhisi reboots.
Tsanangudzo pfupi yekuti sei sed process yekupinda inogona kuwanikwa mukati n
zvakatsanangurwa semusaranisi wemutsara.
Mukupfuura kwakati wandei uye nekurudziro yewandinoshanda naye, takanyora sed script yakapa mhedzisiro yakafanana neyekutanga mutsara 116.
Pazasi pane faira remuenzaniso rine data rekuisa:
> 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
Izvi zvinogona kunge zvisiri pachena kubva pane tsananguro iri pamusoro, asi isu tinongofarira mhinduro yekutanga // VCL.SHOW
, uye panogona kunge paine akati wandei mu data rekuisa. Ichi ndicho chikonzero iyo yepakutanga awk inopera mushure memutambo wekutanga.
# шаг первый, вывести только строки с комментариями
# используя возможности 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
Saka, zviri mukati mevarnishreload script zvichataridzika seizvi:
VCL_FILE="$(echo "$VCL_SHOW" | sed -En '#// VCL.SHOW#{s#.*[0-9]+ [0-9]+ (.*)$#1#p;q;};')"
Iyo logic iri pamusoro inogona kutsanangurwa muchidimbu sezvizvi:
Kana tambo yacho ichienderana nechirevo chenguva dzose // VCL.SHOW
, wodya nemakaro mashoko anosanganisira nhamba dzose dziri mumutsara uyu, uye chengetedza zvose zvinenge zvasara mushure mekushanda uku. Bvisa kukosha kwakachengetwa uye kupedza purogiramu.
Nyore, handizvo here?
Isu takafara ne sed script uye chokwadi chekuti yakatsiva iyo yese yekutanga kodhi. Yese bvunzo dzangu dzakapa mhedzisiro yaidiwa, saka ndakachinja "varnishreload" pane server ndokumhanya zvakare. systemctl reload varnish
. Kukanganisa kwakaipa echo: write error: Broken pipe
takaseka zviso zvedu zvakare. Iyo yekuchonya cursor yaive yakamirira murairo mutsva kuti upinzwe murima risina chinhu cheterminal...
Source: www.habr.com