, Lẹhin ti o ti tẹ lori awọn bọtini fun awọn iṣẹju 20 ti tẹlẹ bi ẹnipe igbesi aye rẹ dale lori rẹ, o yipada si mi pẹlu ikosile ologbele-egan ni oju rẹ ati ẹrin ẹgàn - "Dude, Mo ro pe mo ye."
“Wo ibi,” o sọ, ti o tọka si ọkan ninu awọn ohun kikọ loju iboju, “Mo tẹtẹ fila pupa mi pe ti a ba ṣafikun nibi ohun ti Mo kan ranṣẹ si ọ” - tọka si apakan koodu miiran - “aṣiṣe naa kii yoo mọ. ṣe afihan."
Iyalẹnu diẹ ati ti rẹ, Mo yi alaye sed ti a ti ṣiṣẹ lori fun igba diẹ, ṣafipamọ faili naa, ati ṣiṣe systemctl varnish reload. Ifiranṣẹ aṣiṣe ti sọnu...
“Awọn imeeli ti Mo paarọ pẹlu oludije,” ẹlẹgbẹ mi tẹsiwaju, bi ẹrin rẹ ti n rẹrin sinu ẹrin tootọ ti o kun fun ayọ, “O lojiji o han si mi pe eyi jẹ iru iṣoro kanna!”
Bawo ni gbogbo rẹ ṣe bẹrẹ
Nkan naa dawọle oye ti bii bash, awk, sed ati systemd ṣiṣẹ. Imọ ti varnish jẹ ayanfẹ ṣugbọn ko nilo.
Awọn aami akoko ni awọn snippets ti yipada.
Ti a kọ pẹlu .
Ọrọ yii jẹ itumọ atilẹba ti a tẹjade ni Gẹẹsi ọsẹ meji sẹhin; itumọ .
Oorun ti nmọlẹ nipasẹ awọn ferese panoramic ni owurọ Igba Irẹdanu Ewe miiran ti o gbona, ago kan ti ohun mimu caffeinated tuntun kan wa si ẹgbẹ ti keyboard, orin aladun ayanfẹ ti awọn ohun dun ninu awọn agbekọri lori rustle ti awọn bọtini itẹwe ẹrọ, ati titẹsi akọkọ ninu akojọ ti awọn tiketi backlog lori igbimọ kanban pẹlu ere ti nmọlẹ pẹlu akọle ayanmọ "Ṣawadii varnishreload sh: iwoyi: Aṣiṣe I / O ni iṣeto" (Ṣawadii "varnishreload sh: iwoyi: I / O aṣiṣe" ni iṣeto). Nigbati o ba wa si varnish, ko si ati pe ko le jẹ awọn aṣiṣe eyikeyi, paapaa ti wọn ko ba fa awọn iṣoro eyikeyi, bi ninu ọran yii.
Fun awon ti o wa ni ko faramọ pẹlu , Eyi jẹ iwe afọwọkọ ikarahun ti o rọrun ti a lo lati tun atunto naa ṣe - tun npe ni VCL.
Gẹgẹbi akọle tikẹti naa ṣe imọran, aṣiṣe naa waye lori ọkan ninu awọn olupin ni ipele naa, ati pe niwọn igba ti Mo ni igboya pe ipa ọna varnish ni ipele naa n ṣiṣẹ daradara, Mo ro pe eyi yoo jẹ aṣiṣe kekere kan. Nitorinaa, o kan ifiranṣẹ kan ti o wọle si ṣiṣan ti o ti paade tẹlẹ. Mo gba tikẹti kan fun ara mi, ni igbẹkẹle kikun pe Emi yoo samisi ti o ṣetan ni o kere ju awọn iṣẹju 30, tẹ ara mi ni ejika fun yiyọ igbimọ ti ijekuje atẹle ati pada si awọn nkan pataki diẹ sii.
Ti n ṣubu sinu odi ni 200 km / h
Ṣii faili kan varnishreload, lórí ọ̀kan lára àwọn olupin tí a ń ṣàkóso Debian Na ara mi, mo ri iwe afọwọkọ ikarahun ti ko to awọn ila 200 ni gigun.
Nṣiṣẹ nipasẹ iwe afọwọkọ, Emi ko rii ohunkohun ti o le fa awọn iṣoro nigbati o nṣiṣẹ ni ọpọlọpọ igba taara lati ebute naa.
Lẹhinna, eyi jẹ ipele kan, paapaa ti o ba fọ, ko si ẹnikan ti yoo kerora, daradara ... kii ṣe pupọ. Mo ṣiṣe awọn akosile ati ki o wo ohun ti yoo wa ni kọ jade si awọn ebute, ṣugbọn awọn aṣiṣe ko si ohun to han.
Tọkọtaya diẹ nṣiṣẹ lati rii daju pe Emi ko le ṣe atunṣe aṣiṣe laisi diẹ ninu awọn igbiyanju afikun, ati pe Mo bẹrẹ lati ṣawari bi o ṣe le yi iwe afọwọkọ yii pada ki o jẹ ki o tun jabọ aṣiṣe kan.
Le iwe afọwọkọ di STDOUT (lilo > &-)? Tabi STDERR? Ko ṣiṣẹ ni ipari.
O han ni systemd yipada agbegbe ṣiṣe ni diẹ ninu awọn ọna, ṣugbọn bawo, ati kilode?
Mo tan vim ati ṣatunkọ varnishreload, fifi kun set -x ọtun labẹ shebang, nireti pe ṣiṣatunṣe abajade ti iwe afọwọkọ yoo tan ina diẹ.
Faili naa ti wa titi, nitorinaa Mo tun gbe varnish ati rii pe iyipada naa fọ ohun gbogbo patapata… Imukuro jẹ idotin pipe, pẹlu awọn toonu ti koodu C-bi ninu rẹ. Paapaa yiyi ni ebute ko to lati wa ibiti o ti bẹrẹ. Mo daru patapata. Njẹ ipo yokokoro le ni ipa lori iṣẹ ti awọn eto ṣiṣe ni iwe afọwọkọ kan? Rara, akọmalu. Kokoro ninu ikarahun? Orisirisi awọn oju iṣẹlẹ ti o ṣeeṣe ti n fo ni ori mi bi awọn akukọ ni awọn ọna oriṣiriṣi. Ife ohun mimu ti o ni kikun kafeini ṣofo lesekese, irin-ajo yara lọ si ibi idana fun ipese ati… jẹ ki a lọ. Mo ṣii iwe afọwọkọ naa ki o si wo shebang ni pẹkipẹki: #!/bin/sh.
/bin/sh — ó jẹ́ àmì ìsopọ̀ bash kan lásán, nítorí náà a túmọ̀ ìwé ìkọ̀wé náà ní ipò ìbáramu POSIX, àbí bẹ́ẹ̀ kọ́? Rárá o! Ikarahun àìyípadà náà wà nínú Debian - ó jẹ́ àṣírí, àti pé ìyẹn gan-an ni ó jẹ́ fún /bin/sh.
# ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Jan 24 2017 /bin/sh -> dashFun idi ti idanwo, Mo yi shebang pada si #!/bin/bash, kuro set -x ati ki o gbiyanju lẹẹkansi. Lakotan, lori igbasilẹ ti varnish atẹle, aṣiṣe ifarada kan han ninu iṣelọpọ:
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' compiledLaini 124, eyi ni!
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 }Ṣugbọn bi o ti wa ni jade, laini 124 kuku ṣofo ati pe ko si anfani. Mo le ro pe aṣiṣe naa waye gẹgẹbi apakan ti multiline ti o bẹrẹ lori laini 116.
Ohun ti wa ni nipari kọ si oniyipada VCL_FILE bi abajade ti sisẹ iha-ikarahun ti o wa loke?
Ni ibẹrẹ, o firanṣẹ awọn akoonu ti oniyipada naa VLC_SHOW, ti a ṣẹda lori laini 115, si aṣẹ atẹle nipasẹ paipu. Ati lẹhinna kini o ṣẹlẹ nibẹ?
Ni akọkọ, o nlo varnishadm, eyiti o jẹ apakan ti package fifi sori ẹrọ varnish, lati tunto varnish laisi tun bẹrẹ.
aṣẹ abẹlẹ vcl.show -v ti wa ni lo lati jade gbogbo VCL iṣeto ni pato ninu ${VCL_NAME}, lati STDOUT.
Lati ṣe afihan iṣeto VCL lọwọlọwọ lọwọlọwọ, ati ọpọlọpọ awọn ẹya iṣaaju ti awọn atunto ipa-ọna varnish ti o tun wa ni iranti, o le lo varnishadm vcl.list, abajade eyiti yoo jẹ iru si atẹle yii:
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_12587Ayipada iye ${VCL_NAME} ṣeto ni miiran apa ti awọn akosile varnishreload si awọn orukọ ti awọn Lọwọlọwọ lọwọ VCL, ti o ba ti eyikeyi. Ni idi eyi yoo jẹ "tun gbee_20190101_120000_12397".
O dara, oniyipada. ${VCL_SHOW} ni awọn pipe iṣeto ni fun varnish, ki jina ko o. Bayi ni mo nipari loye idi dash o wu pẹlu set -x wa ni jade lati wa ni ki bajẹ - o pẹlu awọn akoonu ti awọn Abajade iṣeto ni.
O ṣe pataki lati ni oye pe atunto VCL pipe kan le jẹ igbapọ papọ lati awọn faili lọpọlọpọ. Awọn asọye ara C ni a lo lati ṣalaye ibiti faili atunto kan ti wa ninu omiiran, ati pe iyẹn ni deede ohun ti ila ti snippet koodu atẹle jẹ gbogbo nipa.
Sintasi fun awọn asọye ti n ṣapejuwe awọn faili to wa ni ọna kika atẹle yii:
// VCL.SHOW <NUM> <NUM> <FILENAME>Awọn nọmba ni aaye yii ko ṣe pataki, a nifẹ si orukọ faili naa.
Nitorinaa kini o ṣẹlẹ ninu swamp ti awọn aṣẹ ti o bẹrẹ lori laini 116?
Jẹ ká ro ero o jade.
Ilana naa ni awọn ẹya mẹrin:
- Rọrun
echo, eyi ti o ṣe afihan iye ti oniyipada${VCL_SHOW}echo "$VCL_SHOW" awk, eyiti o wa laini kan (igbasilẹ), nibiti aaye akọkọ, lẹhin pipin ọrọ naa, yoo jẹ “//”, ati ekeji yoo jẹ “VCL.SHOW”.
Awk yoo kọ jade laini akọkọ ti o baamu awọn ilana wọnyi ati lẹhinna da iṣẹ ṣiṣe duro lẹsẹkẹsẹ.awk '$1 == "//" && $2 == "VCL.SHOW" {print; exit}'- Àkọsílẹ koodu ti o tọju awọn iye aaye ni awọn oniyipada marun, ti o yapa nipasẹ awọn aaye. FILE oniyipada karun gba iyokù ila naa. Nikẹhin, iwoyi ti o kẹhin kọ awọn akoonu ti oniyipada naa
${FILE}.{ read -r DELIM VCL_SHOW INDEX SIZE FILE; echo "$FILE" } - Niwọn igba ti gbogbo awọn igbesẹ 1 si 3 ti wa ni pipade ni ikarahun iha kan, abajade ti iye naa
$FILEyoo wa ni kọ si a ayípadàVCL_FILE.
Gẹgẹbi asọye lori laini 119 ṣe imọran, eyi ṣe iranṣẹ nikan idi ti mimu awọn ọran ni igbẹkẹle nibiti VCL yoo tọka si awọn faili pẹlu awọn ohun kikọ aaye funfun ni awọn orukọ wọn.
Mo ti asọye awọn atilẹba processing kannaa fun ${VCL_FILE} o si gbiyanju lati yi awọn ọkọọkan ti awọn ofin, sugbon o ko ja si ohunkohun. Ohun gbogbo ṣiṣẹ ni mimọ fun mi, ati ninu ọran ti bẹrẹ iṣẹ naa, o funni ni aṣiṣe.
O dabi pe aṣiṣe kii ṣe atunṣe nigbati o nṣiṣẹ iwe afọwọkọ pẹlu ọwọ, lakoko ti awọn iṣẹju 30 ti a pinnu tẹlẹ ti pari ni igba mẹfa ati, ni afikun, iṣẹ-ṣiṣe pataki ti o ga julọ ti han, titari awọn iyokù awọn ọran naa. Awọn iyokù ti awọn ọsẹ ti a kún pẹlu kan orisirisi ti awọn iṣẹ-ṣiṣe ati awọn ti a nikan die-die ti fomi po pẹlu kan Ọrọ lori sed ati ifọrọwanilẹnuwo pẹlu oludije. Iṣoro aṣiṣe ninu varnishreload irretrievably sọnu ninu awọn iyanrin ti akoko.
Ohun ti a npe ni sed-fu rẹ ... gangan ... idoti
Ọ̀sẹ̀ tó tẹ̀ lé e ní ọjọ́ ọ̀fẹ́ kan ṣoṣo, nítorí náà mo pinnu láti tún gba tikẹ́ẹ̀tì yìí. Mo nireti pe ninu ọpọlọ mi, diẹ ninu ilana isale ni gbogbo akoko yii n wa ojutu si iṣoro yii, ati ni akoko yii Emi yoo ni oye kini ohun ti ko tọ.
Niwọn igba ti o kẹhin kan yiyipada koodu ko ṣe iranlọwọ, Mo kan pinnu lati tun kọ o bẹrẹ lati laini 116. Ni eyikeyi idiyele, koodu ti o wa tẹlẹ jẹ aimọgbọnwa. Ati pe ko si ye lati lo read.
Wiwo aṣiṣe naa lẹẹkansi:
sh: echo: broken pipe - ni aṣẹ yii, iwoyi wa ni awọn aaye meji, ṣugbọn Mo fura pe akọkọ jẹ ẹlẹṣẹ diẹ sii (daradara, tabi o kere ju accomplice). Awk ko ni iwuri boya. Ati ni irú ti o jẹ looto awk | {read; echo} oniru nyorisi si gbogbo awọn wọnyi isoro, idi ti ko ropo o? Aṣẹ ila-kan yii ko lo gbogbo awọn ẹya ti awk, ati paapaa afikun yii read ni appendage.
Niwon ose ti o wà iroyin lori sedMo fe lati gbiyanju mi rinle ipasẹ ogbon ati ki o rọrun echo | awk | { read; echo} sinu kan diẹ understandable echo | sed. Lakoko ti eyi kii ṣe ọna ti o dara julọ lati mu kokoro naa, Mo ro pe Emi yoo kere gbiyanju sed-fu mi ati boya kọ nkan tuntun nipa iṣoro naa. Ni ọna, Mo beere lọwọ ẹlẹgbẹ mi, onkọwe ọrọ sed, lati ṣe iranlọwọ fun mi lati wa pẹlu iwe afọwọkọ sed ti o munadoko diẹ sii.
Mo ju akoonu naa silẹ varnishadm vcl.show -v "$VCL_NAME" si faili kan ki MO le dojukọ lori kikọ iwe afọwọkọ sed laisi eyikeyi wahala ti iṣẹ tun bẹrẹ.
Apejuwe kukuru ti gangan bi sed ṣe n kapa titẹ sii ni a le rii ninu . Ni awọn orisun sed, aami n kedere pato bi a ila separator.
Ni awọn ọna pupọ, ati pẹlu imọran ẹlẹgbẹ mi, a kọ iwe afọwọkọ sed kan ti o funni ni abajade kanna gẹgẹbi gbogbo laini atilẹba 116.
Ni isalẹ ni faili apẹẹrẹ pẹlu data titẹ sii:
> 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 textO le ma han gbangba lati apejuwe loke, ṣugbọn a nifẹ nikan ni asọye akọkọ // VCL.SHOW, ati pe ọpọlọpọ ninu wọn le wa ninu data titẹ sii. Eleyi jẹ idi ti awọn atilẹba awk terminates lẹhin ti akọkọ baramu.
# шаг первый, вывести только строки с комментариями
# используя возможности 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.vclNitorinaa awọn akoonu ti iwe afọwọkọ varnishreload yoo dabi iru eyi:
VCL_FILE="$(echo "$VCL_SHOW" | sed -En '#// VCL.SHOW#{s#.*[0-9]+ [0-9]+ (.*)$#1#p;q;};')"Awọn ọgbọn ti o wa loke le ṣe akopọ bi atẹle:
Ti okun ba baamu ikosile deede // VCL.SHOW, lẹ́yìn náà, fi ìwọra jẹ ọ̀rọ̀ tí ó ní àwọn nọ́ńbà méjèèjì nínú ìlà yẹn, kí o sì fi ohunkóhun tó bá ṣẹ́ kù lẹ́yìn iṣẹ́ abẹ yìí. Ṣe ipinfunni iye ti o fipamọ ati pari eto naa.
Rọrun, ṣe kii ṣe bẹ?
A ni idunnu pẹlu iwe afọwọkọ sed ati otitọ pe o rọpo gbogbo koodu atilẹba. Gbogbo awọn idanwo mi fun awọn abajade ti o fẹ, nitorinaa Mo yipada “varnishreload” lori olupin naa ati tun sare systemctl reload varnish. Aṣiṣe ẹlẹgbin echo: write error: Broken pipe rerin ni oju wa lẹẹkansi. Kọsọ ti n ṣiju kan n duro de aṣẹ tuntun lati wọ inu ofo dudu ti ebute naa...
orisun: www.habr.com
