"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
ʻO kēia kikokikona he unuhi ia o ka mea mua i paʻi ʻia ma ka ʻōlelo Pelekania ʻelua pule aku nei; unuhi
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
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. /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:
- Maʻalahi
echo
, e paʻi ana i ka waiwai o ka hoʻololi${VCL_SHOW}
echo "$VCL_SHOW"
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}'
- ʻ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" }
- 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 loliVCL_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 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