E hāʻule i lalo i ka Hole Rabbit: ʻO ka moʻolelo o kahi hewa reboot varnish - Mahele 1

ghostinushanka, i ka hāmama ana i nā pihi no nā minuke 20 i hala iho nei me he mea lā e hilinaʻi ana kona ola ma luna o ia, huli mai iaʻu me ka nānā ʻana i nā maka a me ka ʻakaʻaka maʻalahi - "E ka hoa, manaʻo wau ua loaʻa iaʻu."

"E nānā i ʻaneʻi," wahi āna, me ke kuhikuhi ʻana i kekahi o nā hōʻailona ma ka pale, "Ua pili wau i koʻu pāpale ʻulaʻula inā mākou e hoʻohui i ka mea aʻu i hoʻouna aku ai iā ʻoe," me ke kuhikuhi ʻana i kekahi ʻāpana o ke code, "ʻaʻole e hewa ka hewa. e hōʻike ʻia."

Pīhoihoi a luhi, hoʻololi wau i ka ʻōlelo sed a mākou e hana nei no kekahi manawa, mālama i ka faila a holo. systemctl varnish reload. Ua nalowale ka memo hewa...

"ʻO nā leka uila aʻu i hoʻololi ai me ka moho," i hoʻomau ai koʻu hoa hana, i ka ulu ʻana o kona ʻakaʻaka i ʻakaʻaka maoli o ka hauʻoli, "Ua ʻike koke ʻia iaʻu he pilikia like kēia!"

Pehea i hoomaka ai

Hoʻomaopopo ka ʻatikala i ke ʻano o ka hana bash, awk, sed a me systemd. ʻOi aku ka ʻike o ka varnish, akā ʻaʻole pono.
Ua hoʻololi ʻia nā kaha manawa ma nā snippet.
Kākau ʻia me ghostinushanka.
ʻO kēia kikokikona he unuhi ia o ka mea mua i paʻi ʻia ma ka ʻōlelo Pelekania ʻelua pule aku nei; unuhi boikoden.

Puhi mai ka lā ma nā puka aniani i kekahi kakahiaka hoʻoluʻu mahana ʻē aʻe, hoʻomaha kahi kīʻaha inu waiʻona nui i hoʻomākaukau hou ʻia mai ka papa keyboard, kani kāu mele punahele o nā leo i loko o kou mau poʻo, e hoʻopololei ana i ka rustle o nā kīwī mechanical, a me ke komo mua. i ka papa inoa o nā tikiki backlog ma ka papa Kanban playfully glows me ka fateful title "E noiʻi varnishreload" sh: echo: I / O hewa i ka staging "(E noiʻi "varnishreload sh: echo: I / O hewa" ma staging). I ka wā e pili ana i ka varnish, aia a ʻaʻole hiki ke lilo i wahi no nā hewa, ʻoiai inā ʻaʻole lākou e hopena i nā pilikia e like me kēia hihia.

No ka poe kamaaina ole varnishreload, he palapala shell maʻalahi kēia i hoʻohana ʻia e hoʻouka hou i ka hoʻonohonoho varnish - kapa ʻia ʻo VCL.

E like me ka hōʻike ʻana o ke poʻo inoa o ka tiketi, ua loaʻa ka hewa ma kekahi o nā kikowaena ma ke kahua, a no ka mea ua maopopo iaʻu e holo pono ana ka varnish ma ke kahua, ua manaʻo wau he hewa liʻiliʻi kēia. No laila, he memo wale nō i hoʻopau ʻia i kahi kahawai puka i pani ʻia. Lawe au i ka tikiki no'u iho, me ka hilinai piha e kaha au ia mea i ka makaukau ma lalo o 30 mau minuke, e pa'i ia'u iho ma ke kua no ka holoi ana i ka papa i kekahi opala hou a hoi hou i na mea nui.

Hāʻule i ka pā ma 200 km/h

Ke wehe nei i ka faila varnishreload, ma kekahi o nā kikowaena e holo ana iā Debian Stretch, ua ʻike au i kahi hōʻailona shell ma lalo o 200 laina lōʻihi.

Ma hope o ka hele ʻana i ka palapala, ʻaʻole wau i ʻike i kekahi mea e hiki ke hopena i nā pilikia ke holo pololei i nā manawa he nui mai ka pahu.

Ma hope o nā mea a pau, he pae kēia, inā paha e haki, ʻaʻohe mea e hoʻopiʻi, ʻeā... ʻaʻole nui loa. Holo wau i ka palapala a ʻike i ka mea e kākau ʻia i ka terminal, akā ʻaʻole ʻike hou ʻia nā hewa.

Ke holo nei kekahi mau mea hou e hōʻoia ʻaʻole hiki iaʻu ke hana hou i ka hewa me ka ʻole o ka hoʻoikaika ʻana, a ke hoʻomaka nei au e noʻonoʻo pehea e hoʻololi ai i kēia palapala a hoʻolei i kahi hewa.

Hiki i ka palapala ke hoʻololi iā STDOUT (hoʻohana > &-)? A i ʻole STDERR? ʻAʻohe o kēia mau hana i ka hopena.

ʻIke ʻia ʻo systemd e hoʻololi i ke ʻano hoʻomaka, akā pehea, a no ke aha?
Wehe wau i ka vim a hoʻoponopono varnishreload, hoʻohui set -x aia ma lalo o ka shebang, me ka manaʻo e hoʻomālamalama ka hoʻopuka debug o ka palapala.

Hoʻoponopono ʻia ka faila, no laila e hoʻouka hou wau i ka varnish a ʻike i ka hoʻololi ʻana i nā mea āpau ... ʻAʻole lawa ka ʻōwili ʻana i ka terminal e ʻike i kahi e hoʻomaka ai. Pioloke loa au. Hiki ke hoʻopili ke ʻano debugging i ka hana o nā polokalamu i hoʻokuʻu ʻia ma kahi palapala? ʻAʻole, he mea lapuwale. Bug i loko o ka pūpū? Ke holo nei kekahi mau hiʻohiʻona ma koʻu poʻo e like me nā moho ma nā ʻaoʻao like ʻole. Hoʻopau koke ʻia ke kīʻaha o ka mea inu caffeinated, kahi huakaʻi wikiwiki i ka lumi kuke e hoʻopiha hou i ka waihona a ... hele mākou. Wehe au i ka palapala a nānā pono i ka shebang: #!/bin/sh.

/bin/sh - he symlink wale nō kēia i ka bash, no laila ua unuhi ʻia ka ʻatikala ma ke ʻano kūpono POSIX, ʻaʻole? ʻAʻole pēlā! ʻO ka pūpū paʻamau ma Debian he dash, a ʻo ia ke ʻano o kona ʻano. pili /bin/sh.

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

Ma ke ʻano he hoʻāʻo, ua hoʻololi au i ka shebang i #!/bin/bash, holoiia set -x a hoao hou. ʻO ka hope, ma hope o ka hoʻomaka hou ʻana o ka varnish, ua ʻike ʻia kahi hewa ʻae ʻia i ka hopena:

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

Laina 124, eia!

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 }

Akā, e like me ka mea i ʻike ʻia, ʻo ka laina 124 ua nele loa a ʻaʻohe hoihoi. Hiki iaʻu ke manaʻo ua loaʻa ka hewa ma ke ʻano he laina multiline e hoʻomaka ana ma ka laina 116.
He aha ka mea i kākau hope ʻia i ka loli? VCL_FILE ma muli o ka hoʻokō ʻana i ka sub-shell i luna?

I ka hoʻomaka ʻana, hoʻouna ʻo ia i nā mea i loko o ka loli VLC_SHOW, hana ʻia ma ka laina 115, ma muli o ke kauoha ma o ka paipu. A laila he aha ka hana ma laila?

ʻO ka mea mua, hoʻohana ʻia ma laila varnishadm, he ʻāpana ia o ka pūʻolo hoʻokomo varnish, no ka hoʻonohonoho ʻana i ka varnish me ka ʻole e hoʻomaka hou.

pūʻulu liʻiliʻi vcl.show -v hoʻohana ʻia e hoʻopuka i ka hoʻonohonoho VCL holoʻokoʻa i kuhikuhi ʻia ma ${VCL_NAME}, iā STDOUT.

No ka hōʻike ʻana i ka hoʻonohonoho VCL hana o kēia manawa, a me kekahi mau mana o mua o nā hoʻonohonoho routing varnish i hoʻomanaʻo mau ʻia, hiki iā ʻoe ke hoʻohana i ke kauoha. varnishadm vcl.list, e like ana ka hopena me ka mea i lalo:

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

Waiwai hoʻololi ${VCL_NAME} ua hoʻokomo ʻia ma kahi ʻāpana ʻē aʻe o ka palapala varnishreload i ka inoa o ka VCL e hana nei i kēia manawa, inā aia kekahi. I kēia hihia, ʻo ia ka "reload_20190101_120000_12397".

Nui, loli ${VCL_SHOW} Loaʻa ka hoʻonohonoho piha no ka varnish, maopopo i kēia manawa. I kēia manawa ua maopopo iaʻu ke kumu o ka hopena dash set -x ua haʻihaʻi loa ia - ua hoʻokomo ʻia nā ʻike o ka hoʻonohonoho hopena.

He mea nui e hoʻomaopopo i hiki ke hoʻopili pinepine ʻia kahi hoʻonohonoho VCL piha mai kekahi mau faila. Hoʻohana ʻia nā manaʻo C-style e ʻike i kahi i hoʻokomo ʻia ai kekahi mau faila hoʻonohonoho i loko o nā mea ʻē aʻe, a ʻo ia ka mea e pili ana i kēia laina o ka snippet code.
ʻO ka syntax no nā manaʻo e wehewehe ana i nā faila ma ke ʻano penei:

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

ʻAʻole koʻikoʻi nā helu i kēia pōʻaiapili, makemake mākou i ka inoa faila.

He aha ka hopena i loko o ka wai o nā kauoha e hoʻomaka ana ma ka laina 116?
E noʻonoʻo kākou.
ʻEhā ʻāpana ka hui:

  1. Maʻalahi echo, e paʻi ana i ka waiwai o ka hoʻololi ${VCL_SHOW}
    echo "$VCL_SHOW"
  2. awk, e ʻimi ana i kahi laina (record) kahi o ka māla mua, ma hope o ka haki ʻana i ke kikokikona, ʻo ia ka "//", a ʻo ka lua ʻo "VCL.SHOW".
    E kākau ʻo Awk i ka laina mua e pili ana i kēia mau hiʻohiʻona a laila hoʻōki koke i ka hana.

    awk '$1 == "//" && $2 == "VCL.SHOW" {print; exit}'
  3. ʻO kahi poloka o ke code e mālama ana i nā waiwai kahua i ʻelima mau ʻano, hoʻokaʻawale ʻia e nā hakahaka. Loaʻa ka ʻelima FILE i ke koena o ka laina. ʻO ka hope, kākau ka leo hope i nā mea i loko o ka loli ${FILE}.
    { read -r DELIM VCL_SHOW INDEX SIZE FILE; echo "$FILE" }
  4. No ka mea, ua hoʻopaʻa ʻia nā ʻanuʻu a pau 1 a 3 i loko o kahi subshell, e hoʻopuka ana i ka waiwai $FILE e kākau ʻia i kahi loli VCL_FILE.

E like me ka manaʻo ma ka laina 119, ʻo ia ke kumu hoʻokahi o ka mālama pono ʻana i nā hihia kahi e kuhikuhi ai ʻo VCL i nā faila me nā hakahaka ma ko lākou mau inoa.

Ua haʻi aku au i ka loiloi hoʻoponopono kumu no ${VCL_FILE} a ho'āʻo e hoʻololi i ke kaʻina kauoha, akā ʻaʻole ia i alakaʻi i kekahi mea. Ua hana maikaʻi nā mea a pau iaʻu, akā i koʻu hoʻomaka ʻana i ka lawelawe ua hāʻawi ia i kahi hewa.

Me he mea lā ʻaʻole hiki ke hoʻihoʻi hou ʻia ka hewa i ka wā e holo ana i ka palapala me ka lima, ʻoiai ʻo nā minuke 30 i manaʻo ʻia ua pau i ʻeono mau manawa a, ʻoi aku, ua ʻike ʻia kahi hana koʻikoʻi kiʻekiʻe, e kāpae ana i nā mea ʻē aʻe. Ua hoʻopiha ʻia ke koena o ka pule i nā hana like ʻole a ua hoʻoheheʻe wale ʻia e ka hōʻike e pili ana i ka sed a me kahi nīnauele me kahi moho. Pilikia me ka hewa i loko varnishreload ua nalowale loa i ke one o ka manawa.

ʻO kāu mea i kapa ʻia ʻo sed-fu ... ʻo ia ... he ʻōpala

I ka pule aʻe ua loaʻa iaʻu hoʻokahi lā kūʻokoʻa, no laila ua hoʻoholo wau e hoʻopaʻa hou i kēia tiketi. Manaʻolana wau i loko o koʻu lolo, ua ʻimi kekahi kaʻina hana hope i ka hopena i kēia pilikia i kēia manawa a pau, a i kēia manawa e maopopo iaʻu ka mea e hana nei.

No ka mea ʻaʻole i kōkua ka hoʻololi ʻana i ke code i ka manawa hope loa, ua hoʻoholo wau e kākau hou iā ia e hoʻomaka ana mai ka laina 116. ʻO kēlā me kēia hihia, he naʻaupō ke code i loaʻa. A ʻaʻohe pono e hoʻohana read.

Ke nānā hou nei i ka hewa:
sh: echo: broken pipe - ʻike ʻia ka leo ma nā wahi ʻelua i kēia kauoha, akā manaʻo wau ʻo ka mea mua ka mea hewa loa (a i ʻole he mea hoʻopili). ʻAʻole hoʻoulu ʻo Awk i ka hilinaʻi. A inā ʻoiaʻiʻo awk | {read; echo} alakaʻi ka hoʻolālā i kēia mau pilikia a pau, no ke aha e hoʻololi ʻole ai? ʻAʻole hoʻohana kēia kauoha laina hoʻokahi i nā hiʻohiʻona āpau o awk, a ʻo kēia hoʻi read kahi mea hou aʻe.

Mai ka pule i hala aku nei he hoike no sed, Ua makemake au e ho'āʻo i kaʻu mau mākau i loaʻa hou a maʻalahi echo | awk | { read; echo} i mea maopopo loa echo | sed. ʻOiai ʻaʻole kēia ke ala maikaʻi loa e ʻike ai i ka bug, manaʻo wau e hoʻāʻo iki i kaʻu sed-fu a aʻo paha i kahi mea hou e pili ana i ka pilikia. Ma ke ala, ua noi au i koʻu hoa hana, ka mea kākau o ke kamaʻilio sed, e kōkua mai iaʻu e hana i kahi palapala sed ʻoi aku ka maikaʻi.

Ua haʻalele au i nā mea i loko varnishadm vcl.show -v "$VCL_NAME" i kahi faila, no laila hiki iaʻu ke nānā aku i ke kākau ʻana i ka script sed me ka pilikia ʻole o ka lawelawe hou ʻana.

ʻO kahi wehewehe pōkole o ke ʻano o ka loaʻa ʻana o nā kaʻina hana sed i loko kana palapala GNU. Ma nā kumu sed ka hōʻailona n i wehewehe ʻia ma ke ʻano he mea hoʻokaʻawale laina.

I kekahi mau ala a me nā ʻōlelo aʻoaʻo a koʻu hoa hana, ua kākau mākou i kahi palapala sed i hāʻawi i ka hopena like me ka laina kumu holoʻokoʻa 116.

Aia ma lalo kahi waihona laʻana me ka ʻikepili hoʻokomo:

> 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

ʻAʻole maopopo paha kēia mai ka wehewehe ʻana ma luna, akā makemake wale mākou i ka ʻōlelo mua // VCL.SHOW, a he nui paha o lākou i ka ʻikepili hoʻokomo. ʻO ia ke kumu i pau ai ka awk kumu ma hope o ka pāʻani mua.

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

No laila, ʻo nā mea o ka palapala varnishreload e like me kēia:

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

Hiki ke hōʻike pōkole ʻia ka logic i luna penei:
Inā pili ke kaula i ka ʻōlelo maʻamau // VCL.SHOW, a laila e ʻai me ke kuko i ka kikokikona i loaʻa nā helu ʻelua i kēia laina, a mālama i nā mea a pau i koe ma hope o kēia hana. Emit i ka waiwai i mālama ʻia a hoʻopau i ka papahana.

Maʻalahi, ʻaʻole anei?

Ua hauʻoli mākou i ka script sed a me ka ʻoiaʻiʻo ua hoʻololi ia i nā code kumu āpau. Hāʻawi kaʻu mau hoʻāʻo a pau i nā hopena i makemake ʻia, no laila ua hoʻololi au i ka "varnishreload" ma ke kikowaena a holo hou. systemctl reload varnish. hewa hewa echo: write error: Broken pipe ʻakaʻaka hou i ko mākou mau maka. Ke kali nei ka cursor winking i kahi kauoha hou e hoʻokomo ʻia i loko o ka pōʻeleʻele o ka pahu ...

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka