Falling Down the Rabbit Hole: ื”ืกื™ืคื•ืจ ืฉืœ ืฉื’ื™ืืช ืืชื—ื•ืœ ืžื—ื“ืฉ ืฉืœ ืœื›ื” - ื—ืœืง 1

ื’ื•ืกื˜ื™ื ื•ืฉื ืงื”, ืื—ืจื™ ืฉื—ื‘ื˜ ืขืœ ื”ื›ืคืชื•ืจื™ื ื‘-20 ื”ื“ืงื•ืช ื”ืงื•ื“ืžื•ืช ื›ืื™ืœื• ื—ื™ื™ื• ืชืœื•ื™ื™ื ื‘ื–ื”, ืคื•ื ื” ืืœื™ื™ ืขื ื”ื‘ืขื” ื—ืฆื™ ืคืจื•ืขื” ื‘ืขื™ื ื™ื• ื•ื—ื™ื•ืš ืขืจืžื•ืžื™ - "ืื—ื™, ืื ื™ ื—ื•ืฉื‘ ืฉืื ื™ ืžื‘ื™ืŸ".

"ืชืกืชื›ืœ ื›ืืŸ," ื”ื•ื ืื•ืžืจ, ืžืฆื‘ื™ืข ืขืœ ืื—ืช ื”ื“ืžื•ื™ื•ืช ืขืœ ื”ืžืกืš, "ืื ื™ ืžืชืขืจื‘ ืขืœ ื”ื›ื•ื‘ืข ื”ืื“ื•ื ืฉืœื™ ืฉืื ื ื•ืกื™ืฃ ืœื›ืืŸ ืืช ืžื” ืฉืฉืœื—ืชื™ ืœืš ืขื›ืฉื™ื•" - ืžืฆื‘ื™ืข ืขืœ ืงื˜ืข ืื—ืจ ื‘ืงื•ื“ - "ื”ืฉื’ื™ืื” ื›ื‘ืจ ืœื ืชื”ื™ื” ืœื”ื™ื•ืช ืžื•ืฆื’."

ืงืฆืช ืžื‘ื•ืœื‘ืœ ื•ืขื™ื™ืฃ, ืื ื™ ืžืฉื ื” ืืช ื”ืฆื”ืจืช sed ืฉืขื‘ื“ื ื• ืขืœื™ื” ื–ืžืŸ ืžื”, ืฉื•ืžืจ ืืช ื”ืงื•ื‘ืฅ ื•ืจืฅ systemctl varnish reload. ื”ื•ื“ืขืช ื”ืฉื’ื™ืื” ื ืขืœืžื”...

"ื”ืžื™ื™ืœื™ื ืฉื”ื—ืœืคืชื™ ืขื ื”ืžื•ืขืžื“", ื”ืžืฉื™ืš ืขืžื™ืชื™, ื›ืฉื”ื—ื™ื•ืš ืฉืœื• ื”ื•ืคืš ืœื—ื™ื•ืš ืืžื™ืชื™ ื•ืžืœื ืฉืžื—ื”, "ืคืชืื•ื ื”ืชื‘ืจืจ ืœื™ ืฉื–ื• ื‘ื“ื™ื•ืง ืื•ืชื” ื‘ืขื™ื”!"

ืื™ืš ื”ื›ืœ ื”ืชื—ื™ืœ

ื”ืžืืžืจ ืžื ื™ื— ื”ื‘ื ื” ืฉืœ ืื™ืš bash, awk, sed ื•-systemd ืขื•ื‘ื“ื™ื. ืขื“ื™ืคื•ืช ืœื™ื“ืข ื‘ืœื›ื” ืืš ืœื ื—ื•ื‘ื”.
ื—ื•ืชืžื•ืช ื”ื–ืžืŸ ื‘ืงื˜ืขื™ื ืฉื•ื ื•.
ื ื›ืชื‘ ืขื ื’ื•ืกื˜ื™ื ื•ืฉื ืงื”.
ื˜ืงืกื˜ ื–ื” ื”ื•ื ืชืจื’ื•ื ืฉืœ ื”ืžืงื•ืจ ืฉืคื•ืจืกื ื‘ืื ื’ืœื™ืช ืœืคื ื™ ืฉื‘ื•ืขื™ื™ื; ืชึดืจื’ื•ึผื boyikoden.

ื”ืฉืžืฉ ื–ื•ืจื—ืช ืžื‘ืขื“ ืœื—ืœื•ื ื•ืช ื”ืคื ื•ืจืžื™ื™ื ื‘ื‘ื•ืงืจ ืกืชื•ื•ื™ ื—ืžื™ื ื ื•ืกืฃ, ื›ื•ืก ืžืฉืงื” ื˜ืจื™ ืฉื ืจืงื— ืขื ืงืคืื™ืŸ ืžื•ื ื—ืช ืœืฆื“ ื”ืžืงืœื“ืช, ืกื™ืžืคื•ื ื™ื” ืื”ื•ื‘ื” ืฉืœ ืฆืœื™ืœื™ื ืžืชื ื’ื ืช ื‘ืื•ื–ื ื™ื•ืช ืžืขืœ ืจืฉืจื•ืฉ ืžืงืœื“ื•ืช ืžื›ื ื™ื•ืช, ื•ื”ื›ื ื™ืกื” ื”ืจืืฉื•ื ื” ื‘- ืจืฉื™ืžืช ื›ืจื˜ื™ืกื™ ื”-backlog ื‘ืœื•ื— ื”ืงืื ื‘ืŸ ื–ื•ื”ืจืช ื‘ืฉื•ื‘ื‘ื•ืช ืขื ื”ื›ื•ืชืจืช ื”ื’ื•ืจืœื™ืช "ื—ืงืจ ืืช varnishreload sh: echo: I/O error in staging" (ื—ืงืจ ืืช "varnishreload sh: echo: I/O error" ื‘-Staging). ื›ืฉืžื“ื•ื‘ืจ ื‘ืœื›ื”, ืื™ืŸ ื•ืœื ื™ื›ื•ืœื•ืช ืœื”ื™ื•ืช ื˜ืขื•ื™ื•ืช, ื’ื ืื ื”ืŸ ืœื ื’ื•ืจืžื•ืช ืœื‘ืขื™ื•ืช, ื›ืžื• ื‘ืžืงืจื” ื”ื–ื”.

ืœืžื™ ืฉืœื ืžื›ื™ืจ ื˜ืขื™ื ืช ืœื›ื”, ื–ื”ื• ืกืงืจื™ืคื˜ ืžืขื˜ืคืช ืคืฉื•ื˜ ื”ืžืฉืžืฉ ืœื˜ืขื™ื ื” ืžื—ื“ืฉ ืฉืœ ื”ืชืฆื•ืจื” ืœึทื›ึผึธื” - ื ืงืจื ื’ื VCL.

ื›ืคื™ ืฉืžืจืžื–ืช ื”ื›ื•ืชืจืช ืฉืœ ื”ื›ืจื˜ื™ืก, ื”ืฉื’ื™ืื” ืื™ืจืขื” ื‘ืื—ื“ ื”ืฉืจืชื™ื ื‘ืฉืœื‘, ื•ืžื›ื™ื•ื•ืŸ ืฉื”ื™ื™ืชื™ ื‘ื˜ื•ื— ืฉื”ื ื™ืชื•ื‘ ืฉืœ ืœื›ื” ื‘ืฉืœื‘ ืขื•ื‘ื“ ื›ืžื• ืฉืฆืจื™ืš, ื”ื ื—ืชื™ ืฉื–ื• ืชื”ื™ื” ื˜ืขื•ืช ืงืœื”. ืื–, ืจืง ื”ื•ื“ืขื” ืฉื ื›ื ืกื” ืœื–ืจื ืคืœื˜ ืฉื›ื‘ืจ ืกื’ื•ืจ. ืื ื™ ืœื•ืงื— ืœืขืฆืžื™ ื›ืจื˜ื™ืก, ื‘ื‘ื™ื˜ื—ื•ืŸ ืžืœื ืฉืืกืžืŸ ืื•ืชื• ืžื•ื›ืŸ ืชื•ืš ืคื—ื•ืช ืž-30 ื“ืงื•ืช, ื˜ื•ืคื— ืœืขืฆืžื™ ืขืœ ื”ืฉื›ื ืขืœ ืคื™ื ื•ื™ ื”ืœื•ื— ืžื”ื’'ืื ืง ื”ื‘ื ื•ื—ื•ื–ืจ ืœื“ื‘ืจื™ื ื—ืฉื•ื‘ื™ื ื™ื•ืชืจ.

ื”ืชื ื’ืฉื•ืช ื‘ืงื™ืจ ื‘ืžื”ื™ืจื•ืช ืฉืœ 200 ืงืž"ืฉ

ืคืชื™ื—ืช ืงื•ื‘ืฅ varnishreload, ื‘ืื—ื“ ื”ืฉืจืชื™ื ืฉื‘ื”ื ืคื•ืขืœ Debian Stretch, ืจืื™ืชื™ ืกืงืจื™ืคื˜ ืžืขื˜ืคืช ื‘ืื•ืจืš ืฉืœ ืคื—ื•ืช ืž-200 ืฉื•ืจื•ืช.

ื‘ื”ืจืฆืช ื”ืกืงืจื™ืคื˜, ืœื ืจืื™ืชื™ ืฉื•ื ื“ื‘ืจ ืฉื™ื›ื•ืœ ืœื’ืจื•ื ืœื‘ืขื™ื•ืช ื‘ืขืช ื”ืคืขืœืชื• ืžืกืคืจ ืคืขืžื™ื ื™ืฉื™ืจื•ืช ืžื”ืžืกื•ืฃ.

ื”ืจื™ ื–ื” ืฉืœื‘, ื’ื ืื ื™ื™ืฉื‘ืจ ืืฃ ืื—ื“ ืœื ื™ืชืœื•ื ืŸ, ื ื•...ืœื ื™ื•ืชืจ ืžื“ื™. ืื ื™ ืžืจื™ืฅ ืืช ื”ืกืงืจื™ืคื˜ ื•ืจื•ืื” ืžื” ื™ื™ื›ืชื‘ ืœืžืกื•ืฃ, ืื‘ืœ ื”ืฉื’ื™ืื•ืช ื›ื‘ืจ ืœื ื ืจืื•ืช.

ืขื•ื“ ื›ืžื” ืจื™ืฆื•ืช ื›ื“ื™ ืœื•ื•ื“ื ืฉืื ื™ ืœื ื™ื›ื•ืœ ืœืฉื—ื–ืจ ืืช ื”ืฉื’ื™ืื” ื‘ืœื™ ืงืฆืช ืžืืžืฅ ื ื•ืกืฃ, ื•ืื ื™ ืžืชื—ื™ืœ ืœื”ื‘ื™ืŸ ืื™ืš ืœืฉื ื•ืช ืืช ื”ืกืงืจื™ืคื˜ ื”ื–ื” ื•ืœื’ืจื•ื ืœื• ืขื“ื™ื™ืŸ ืœื–ืจื•ืง ืฉื’ื™ืื”.

ื”ืื ื”ืกืงืจื™ืคื˜ ื™ื›ื•ืœ ืœื—ืกื•ื STDOUT (ื‘ืืžืฆืขื•ืช > &-)? ืื• STDERR? ืฉื ื™ื”ื ืœื ืขื‘ื“ื• ื‘ืกื•ืคื• ืฉืœ ื“ื‘ืจ.

ื‘ืจื•ืจ ืฉื”ืžืขืจื›ืช ืžืฉื ื” ืืช ืกื‘ื™ื‘ืช ื”ืจื™ืฆื” ื‘ื“ืจืš ื›ืœืฉื”ื™, ืื‘ืœ ืื™ืš ื•ืœืžื”?
ืื ื™ ืžืคืขื™ืœ ืืช vim ื•ืขื•ืจืš varnishreload, ืžื•ืกื™ืฃ set -x ืžืžืฉ ืžืชื—ืช ืœืฉื‘ืื ื’, ื‘ืชืงื•ื•ื” ืฉืื™ืชื•ืจ ื‘ืื’ื™ื ื‘ืคืœื˜ ืฉืœ ื”ืชืกืจื™ื˜ ื™ืฉืคื•ืš ืงืฆืช ืื•ืจ.

ื”ืงื•ื‘ืฅ ืงื‘ื•ืข, ืื– ืื ื™ ื˜ื•ืขืŸ ืœื›ื” ืžื—ื“ืฉ ื•ืจื•ืื” ืฉื”ืฉื™ื ื•ื™ ืฉื‘ืจ ืœื’ืžืจื™ ืืช ื”ื›ืœ... ื”ืื’ื–ื•ื– ื”ื•ื ื‘ืœื’ืŸ ืžื•ื—ืœื˜, ืขื ื˜ื•ื ื•ืช ืฉืœ ืงื•ื“ ื“ืžื•ื™ C ื‘ืชื•ื›ื•. ืืคื™ืœื• ื’ืœื™ืœื” ื‘ื˜ืจืžื™ื ืœ ืœื ืžืกืคื™ืงื” ื›ื“ื™ ืœืžืฆื•ื ื”ื™ื›ืŸ ื”ื™ื ืžืชื—ื™ืœื”. ืื ื™ ืžื‘ื•ืœื‘ืœ ืœื’ืžืจื™. ื”ืื ืžืฆื‘ ื ื™ืคื•ื™ ื‘ืื’ื™ื ื™ื›ื•ืœ ืœื”ืฉืคื™ืข ืขืœ ื”ืขื‘ื•ื“ื” ืฉืœ ืชื•ื›ื ื™ื•ืช ื”ืžื•ืคืขืœื•ืช ื‘ืกืงืจื™ืคื˜? ื‘ืœื™ ืฉื˜ื•ื™ื•ืช. ื‘ืื’ ื‘ืงืœื™ืคื”? ื›ืžื” ืชืจื—ื™ืฉื™ื ืืคืฉืจื™ื™ื ืขืคื™ื ืœื™ ื‘ืจืืฉ ื›ืžื• ื’'ื•ืงื™ื ืœื›ื™ื•ื•ื ื™ื ืฉื•ื ื™ื. ื›ื•ืก ืžืฉืงื” ืžืœื ืงืคืื™ืŸ ืžืชืจื•ืงื ืช ืžื™ื™ื“ื™ืช, ื ืกื™ืขื” ืžื”ื™ืจื” ืœืžื˜ื‘ื— ืœืืกืคืงื” โ€‹โ€‹ืžื—ื“ืฉ ื•... ื‘ื•ื ื ืœืš. ืื ื™ ืคื•ืชื— ืืช ื”ืชืกืจื™ื˜ ื•ืžืกืชื›ืœ ืžืงืจื•ื‘ ืขืœ ื”ืฉื‘ืื ื’: #!/bin/sh.

/bin/sh - ื–ื” ืจืง ืงื™ืฉื•ืจ ืกื™ืžื‘ื•ืœื™ ืฉืœ bash, ืื– ื”ืชืกืจื™ื˜ ืžืชืคืจืฉ ื‘ืžืฆื‘ ืชื•ืื POSIX, ื ื›ื•ืŸ? ื–ื” ืœื ื”ื™ื” ืฉื! ืžืขื˜ืคืช ื‘ืจื™ืจืช ื”ืžื—ื“ืœ ื‘ื“ื‘ื™ืืŸ ื”ื™ื ืžืงืฃ, ื•ื–ื” ื‘ื“ื™ื•ืง ืžื” ืžืชื™ื™ื—ืก /bin/sh.

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

ืœืžืขืŸ ื”ืžืฉืคื˜, ืฉื™ื ื™ืชื™ ืืช ื”ืฉื‘ืื ื’ ืœ #!/bin/bash, ื”ื•ืกืจ set -x ื•ื ื™ืกื™ืชื™ ืฉื•ื‘. ืœื‘ืกื•ืฃ, ื‘ื˜ืขื™ื ื” ืžื—ื“ืฉ ืฉืœ ืœื›ื”, ื”ื•ืคื™ืขื” ืฉื’ื™ืื” ื ืกื‘ืœืช ื‘ืคืœื˜:

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

ืงื• 124, ื”ื ื” ื–ื”!

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 }

ืื‘ืœ ื›ืคื™ ืฉื”ืชื‘ืจืจ, ืงื• 124 ื“ื™ ืจื™ืง ื•ืœื ืžืขื ื™ื™ืŸ. ื™ื›ื•ืœืชื™ ืจืง ืœื”ื ื™ื— ืฉื”ืฉื’ื™ืื” ื”ืชืจื—ืฉื” ื›ื—ืœืง ืžืจื•ื‘ื” ืงื• ืฉืžืชื—ื™ืœ ื‘ืงื• 116.
ืžื” ื›ืชื•ื‘ ืœื‘ืกื•ืฃ ืœืžืฉืชื ื” VCL_FILE ื›ืชื•ืฆืื” ืžื‘ื™ืฆื•ืข ืชืช-ื”ืžืขื˜ืคืช ื”ื "ืœ?

ื‘ื”ืชื—ืœื”, ื”ื•ื ืฉื•ืœื— ืืช ืชื•ื›ืŸ ื”ืžืฉืชื ื” VLC_SHOW, ืฉื ื•ืฆืจ ื‘ืฉื•ืจื” 115, ืœืคืงื•ื“ื” ื”ื‘ืื” ื“ืจืš ื”ืฆื™ื ื•ืจ. ื•ืื– ืžื” ืงื•ืจื” ืฉื?

ืจืืฉื™ืช, ื”ื•ื ืžืฉืชืžืฉ varnishadm, ื”ืžื”ื•ื•ื” ื—ืœืง ืžื—ื‘ื™ืœืช ื”ืชืงื ืช ืœื›ื”, ื›ื“ื™ ืœื”ื’ื“ื™ืจ ืœื›ื” ืžื‘ืœื™ ืœื”ืคืขื™ืœ ืžื—ื“ืฉ.

ืคืงื•ื“ื” ืžืฉื ื” vcl.show -v ืžืฉืžืฉ ืœืคืœื˜ ืืช ื›ืœ ืชืฆื•ืจืช ื”-VCL ืฉืฆื•ื™ื ื” ื‘ ${VCL_NAME}, ืœ-STDOUT.

ื›ื“ื™ ืœื”ืฆื™ื’ ืืช ืชืฆื•ืจืช ื”-VCL ื”ืคืขื™ืœื” ื›ืขืช ื•ื›ืŸ ืžืกืคืจ ื’ืจืกืื•ืช ืงื•ื“ืžื•ืช ืฉืœ ืชืฆื•ืจื•ืช ื”ื ื™ืชื•ื‘ ืฉืœ ืœื›ื” ืฉืขื“ื™ื™ืŸ ื ืžืฆืื•ืช ื‘ื–ื™ื›ืจื•ืŸ, ืชื•ื›ืœ ืœื”ืฉืชืžืฉ ื‘ืคืงื•ื“ื” varnishadm vcl.list, ืฉื”ืคืœื˜ ืฉืœื• ื™ื”ื™ื” ื“ื•ืžื” ืœื—ืœืง ื”ื‘ื:

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

ืขืจืš ืžืฉืชื ื” ${VCL_NAME} ืžื•ื’ื“ืจ ื‘ื—ืœืง ืื—ืจ ืฉืœ ื”ืชืกืจื™ื˜ varnishreload ืœืฉื ื”-VCL ื”ืคืขื™ืœ ื›ืขืช, ืื ืงื™ื™ื. ื‘ืžืงืจื” ื–ื” ื–ื” ื™ื”ื™ื” "reload_20190101_120000_12397".

ื‘ืกื“ืจ, ืžืฉืชื ื”. ${VCL_SHOW} ืžื›ื™ืœ ืืช ื”ืชืฆื•ืจื” ื”ืžืœืื” ืขื‘ื•ืจ ืœื›ื”, ืขื“ ื›ื” ื‘ืจื•ืจื”. ืขื›ืฉื™ื• ืื ื™ ืกื•ืฃ ืกื•ืฃ ืžื‘ื™ืŸ ืœืžื” ืคืœื˜ ืžืงืฃ ืขื set -x ื”ืชื‘ืจืจ ื›ืœ ื›ืš ืฉื‘ื•ืจ - ื–ื” ื›ืœืœ ืืช ื”ืชื•ื›ืŸ ืฉืœ ื”ืชืฆื•ืจื” ืฉื”ืชืงื‘ืœื”.

ื—ืฉื•ื‘ ืœื”ื‘ื™ืŸ ืฉืœืขืชื™ื ืงืจื•ื‘ื•ืช ื ื™ืชืŸ ืœื—ื‘ืจ ืชืฆื•ืจืช VCL ืฉืœืžื” ืžืžืกืคืจ ืงื‘ืฆื™ื. ื”ืขืจื•ืช ื‘ืกื’ื ื•ืŸ C ืžืฉืžืฉื•ืช ื›ื“ื™ ืœื”ื’ื“ื™ืจ ื”ื™ื›ืŸ ื ื›ืœืœ ืงื•ื‘ืฅ ืชืฆื•ืจื” ืื—ื“ ื‘ืื—ืจ, ื•ื‘ื“ื™ื•ืง ืขืœ ื–ื” ืฉื•ืจืช ืงื˜ืข ื”ืงื•ื“ ื”ื‘ืื”.
ื”ืชื—ื‘ื™ืจ ืœื”ืขืจื•ืช ื”ืžืชืืจื•ืช ืงื‘ืฆื™ื ื›ืœื•ืœื™ื ื‘ืคื•ืจืžื˜ ื”ื‘ื:

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

ื”ืžืกืคืจื™ื ื‘ื”ืงืฉืจ ื–ื” ืื™ื ื ื—ืฉื•ื‘ื™ื, ืื ื• ืžืขื•ื ื™ื™ื ื™ื ื‘ืฉื ื”ืงื•ื‘ืฅ.

ืื– ืžื” ืงื•ืจื” ื‘ื‘ื™ืฆืช ื”ืคืงื•ื“ื•ืช ืฉืžืชื—ื™ืœื” ื‘ืงื• 116?
ื‘ื•ืื• ื ื•ื“ื” ื‘ื–ื”.
ื”ืคืงื•ื“ื” ืžื•ืจื›ื‘ืช ืžืืจื‘ืขื” ื—ืœืงื™ื:

  1. ืคืฉื•ื˜ echo, ื”ืžืฆื™ื’ ืืช ื”ืขืจืš ืฉืœ ื”ืžืฉืชื ื” ${VCL_SHOW}
    echo "$VCL_SHOW"
  2. awk, ืฉืžื—ืคืฉ ืฉื•ืจื” (ืจืฉื•ืžื”), ืฉื‘ื” ื”ืฉื“ื” ื”ืจืืฉื•ืŸ, ืœืื—ืจ ืคื™ืฆื•ืœ ื”ื˜ืงืกื˜, ื™ื”ื™ื” "//", ื•ื”ืฉื ื™ ื™ื”ื™ื” "VCL.SHOW".
    Awk ื™ืจืฉื•ื ืืช ื”ืฉื•ืจื” ื”ืจืืฉื•ื ื” ื”ืชื•ืืžืช ืœื“ืคื•ืกื™ื ืืœื” ื•ืœืื—ืจ ืžื›ืŸ ืชืคืกื™ืง ืืช ื”ืขื™ื‘ื•ื“ ืžื™ื“.

    awk '$1 == "//" && $2 == "VCL.SHOW" {print; exit}'
  3. ื’ื•ืฉ ืงื•ื“ ื”ืžืื—ืกืŸ ืืช ืขืจื›ื™ ื”ืฉื“ื” ื‘ื—ืžื™ืฉื” ืžืฉืชื ื™ื, ืžื•ืคืจื“ื™ื ืขืœ ื™ื“ื™ ืจื•ื•ื—ื™ื. ื”ืžืฉืชื ื” ื”ื—ืžื™ืฉื™ FILE ืžืงื‘ืœ ืืช ืฉืืจ ื”ืฉื•ืจื”. ืœื‘ืกื•ืฃ, ื”ื”ื“ ื”ืื—ืจื•ืŸ ื›ื•ืชื‘ ืืช ืชื•ื›ืŸ ื”ืžืฉืชื ื” ${FILE}.
    { read -r DELIM VCL_SHOW INDEX SIZE FILE; echo "$FILE" }
  4. ืžื›ื™ื•ื•ืŸ ืฉื›ืœ ื”ืฉืœื‘ื™ื 1 ืขื“ 3 ืกื’ื•ืจื™ื ื‘ืชืช-ืžืขื˜ืคืช, ื”ืคืœื˜ ืฉืœ ื”ืขืจืš $FILE ื™ื™ื›ืชื‘ ืœืžืฉืชื ื” VCL_FILE.

ื›ืคื™ ืฉืžืฆื™ืขื” ื”ื”ืขืจื” ื‘ืฉื•ืจื” 119, ื–ื” ืžืฉืจืช ืืช ื”ืžื˜ืจื” ื”ื™ื—ื™ื“ื” ืฉืœ ื˜ื™ืคื•ืœ ืืžื™ืŸ ื‘ืžืงืจื™ื ืฉื‘ื”ื ื”-VCL ื™ืคื ื” ืœืงื‘ืฆื™ื ืขื ืชื•ื•ื™ ืจื•ื•ื— ืœื‘ืŸ ื‘ืฉืžื.

ื”ืขืจืชื™ ืืช ื”ื”ื™ื’ื™ื•ืŸ ื”ืžืงื•ืจื™ ืฉืœ ื”ืขื™ื‘ื•ื“ ${VCL_FILE} ื•ื ื™ืกื” ืœืฉื ื•ืช ืืช ืจืฆืฃ ื”ืคืงื•ื“ื•ืช, ืื‘ืœ ื–ื” ืœื ื”ื•ื‘ื™ืœ ืœื›ืœื•ื. ื”ื›ืœ ืขื‘ื“ ืœื™ ื‘ืฆื•ืจื” ื ืงื™ื™ื”, ื•ื‘ืžืงืจื” ืฉืœ ื”ืคืขืœืช ื”ืฉื™ืจื•ืช, ื–ื” ื ืชืŸ ืฉื’ื™ืื”.

ื ืจืื” ืฉื”ืฉื’ื™ืื” ืคืฉื•ื˜ ืœื ื ื™ืชื ืช ืœืฉื—ื–ื•ืจ ื‘ืขืช ื”ืคืขืœืช ื”ืกืงืจื™ืคื˜ ื‘ืื•ืคืŸ ื™ื“ื ื™, ื‘ืขื•ื“ ืฉ-30 ื”ื“ืงื•ืช ื”ืžืฉื•ืขืจื•ืช ื›ื‘ืจ ื”ืกืชื™ื™ืžื• ืฉืฉ ืคืขืžื™ื ื•ื‘ื ื•ืกืฃ, ื”ื•ืคื™ืขื” ืžืฉื™ืžื” ื‘ืขื“ื™ืคื•ืช ื’ื‘ื•ื”ื” ื™ื•ืชืจ, ืฉื“ื—ืงื” ืืช ืฉืืจ ื”ืชื™ืงื™ื ื”ืฆื™ื“ื”. ืฉืืจ ื”ืฉื‘ื•ืข ื”ื™ื” ืขืžื•ืก ื‘ืžื’ื•ื•ืŸ ืžืฉื™ืžื•ืช ื•ื“ื™ืœืœ ืจืง ืžืขื˜ ื‘ืฉื™ื—ื” ืขืœ ืกื“ ื•ืจืื™ื•ืŸ ืขื ื”ืžื•ืขืžื“. ื‘ืขื™ื™ืช ืฉื’ื™ืื” ื‘ varnishreload ืื‘ื•ื“ ื‘ืœืชื™ ื”ืคื™ืš ื‘ื—ื•ืœ ื”ืžื•ืขื“.

ืžื” ืฉื ืงืจื sed-fu ืฉืœืš... ื‘ืขืฆื... ื–ื‘ืœ

ื‘ืฉื‘ื•ืข ืฉืœืื—ืจ ืžื›ืŸ ื”ื™ื” ื™ื•ื ืื—ื“ ื“ื™ ืคื ื•ื™, ืื– ื”ื—ืœื˜ืชื™ ืœืงื—ืช ืืช ื”ื›ืจื˜ื™ืก ื”ื–ื” ืฉื•ื‘. ืงื™ื•ื•ื™ืชื™ ืฉื‘ืžื•ื— ืฉืœื™, ืชื”ืœื™ืš ืจืงืข ื›ืœืฉื”ื• ื›ืœ ื”ื–ืžืŸ ื”ื–ื” ื—ื™ืคืฉ ืคืชืจื•ืŸ ืœื‘ืขื™ื” ื”ื–ื•, ื•ื”ืคืขื ืื ื™ ื‘ื”ื—ืœื˜ ืื‘ื™ืŸ ืžื” ืœื ื‘ืกื“ืจ.

ืžื›ื™ื•ื•ืŸ ืฉื‘ืคืขื ื”ืื—ืจื•ื ื” ืจืง ืฉื™ื ื•ื™ ื”ืงื•ื“ ืœื ืขื–ืจ, ืคืฉื•ื˜ ื”ื—ืœื˜ืชื™ ืœืฉื›ืชื‘ ืื•ืชื• ื”ื—ืœ ืžื”ืฉื•ืจื” ื”-116. ื‘ื›ืœ ืžืงืจื”, ื”ืงื•ื“ ื”ืงื™ื™ื ื”ื™ื” ื˜ื™ืคืฉื™. ื•ืื™ืŸ ืžืžืฉ ืฆื•ืจืš ืœื”ืฉืชืžืฉ read.

ืžืกืชื›ืœ ืฉื•ื‘ ืขืœ ื”ืฉื’ื™ืื”:
sh: echo: broken pipe - ื‘ืคืงื•ื“ื” ื”ื–ื•, ื”ื“ ื ืžืฆื ื‘ืฉื ื™ ืžืงื•ืžื•ืช, ืื‘ืœ ืื ื™ ื—ื•ืฉื“ ืฉื”ืจืืฉื•ืŸ ื”ื•ื ื”ืืฉื ื”ืกื‘ื™ืจ ื™ื•ืชืจ (ื˜ื•ื‘, ืื• ืœืคื—ื•ืช ืฉื•ืชืฃ). ื’ื Awk ืœื ืžืขื•ืจืจ ื‘ื™ื˜ื—ื•ืŸ. ื•ืœืžืงืจื” ืฉื–ื” ื‘ืืžืช ื›ืš awk | {read; echo} ื”ืขื™ืฆื•ื‘ ืžื•ื‘ื™ืœ ืœื›ืœ ื”ื‘ืขื™ื•ืช ื”ืืœื”, ืœืžื” ืœื ืœื”ื—ืœื™ืฃ ืื•ืชื•? ื”ืคืงื•ื“ื” ื‘ืช ืฉื•ืจื” ืื—ืช ืœื ืžืฉืชืžืฉืช ื‘ื›ืœ ื”ืชื›ื•ื ื•ืช ืฉืœ awk, ื•ืืคื™ืœื• ื‘ืชื•ืกืคืช ื”ื–ื• read ื‘ืชื•ืกืคืช.

ืžืื– ืฉื‘ื•ืข ืฉืขื‘ืจ ื”ื™ื” ื“ื™ื•ื•ื— ืขืœ sedืจืฆื™ืชื™ ืœื ืกื•ืช ืืช ื”ื›ื™ืฉื•ืจื™ื ื”ื—ื“ืฉื™ื ืฉืจื›ืฉืชื™ ื•ืœืคืฉื˜ echo | awk | { read; echo} ืœืชื•ืš ืžื•ื‘ืŸ ื™ื•ืชืจ echo | sed. ืœืžืจื•ืช ืฉื–ื• ื‘ื”ื—ืœื˜ ืœื ื”ื’ื™ืฉื” ื”ื˜ื•ื‘ื” ื‘ื™ื•ืชืจ ืœืชืคื•ืก ืืช ื”ื‘ืื’, ื—ืฉื‘ืชื™ ืฉืœืคื—ื•ืช ืื ืกื” ืืช ื”-sed-fu ืฉืœื™ ื•ืื•ืœื™ ืœืœืžื•ื“ ืžืฉื”ื• ื—ื“ืฉ ืขืœ ื”ื‘ืขื™ื”. ืœืื•ืจืš ื”ื“ืจืš, ื‘ื™ืงืฉืชื™ ืžืขืžื™ืชื™, ื›ื•ืชื‘ ื”ืจืฆืื•ืช ื”ืกืขื“, ืœืขื–ื•ืจ ืœื™ ืœื”ืžืฆื™ื ืชืกืจื™ื˜ ืกื“ ื™ืขื™ืœ ื™ื•ืชืจ.

ื”ื•ืจื“ืชื™ ืืช ื”ืชื•ื›ืŸ varnishadm vcl.show -v "$VCL_NAME" ืœืงื•ื‘ืฅ ื›ื“ื™ ืฉืื•ื›ืœ ืœื”ืชืžืงื“ ื‘ื›ืชื™ื‘ืช ืกืงืจื™ืคื˜ ื”-sed ืœืœื ื›ืœ ื”ื˜ืจื—ื” ืฉืœ ื”ืคืขืœื” ืžื—ื“ืฉ ืฉืœ ื”ืฉื™ืจื•ืช.

ื ื™ืชืŸ ืœืžืฆื•ื ืชื™ืื•ืจ ืงืฆืจ ืฉืœ ื”ืื•ืคืŸ ืฉื‘ื• sed ืžื˜ืคืœ ื‘ืงืœื˜ ืžื“ืจื™ืš ื”ื’ื ื• ืฉืœื•. ื‘ืžืงื•ืจื•ืช ื”ืกื“, ื”ืกืžืœ n ืฆื•ื™ืŸ ื‘ืžืคื•ืจืฉ ื›ืžืคืจื™ื“ ืฉื•ืจื•ืช.

ื‘ื›ืžื” ืžืขื‘ืจื™ื, ื•ื‘ืขืฆืช ืขืžื™ืชื™, ื›ืชื‘ื ื• ืชืกืจื™ื˜ ืกื“ ืฉื ืชืŸ ืืช ืื•ืชื” ืชื•ืฆืื” ื›ืžื• ื›ืœ ืฉื•ืจื” 116 ื”ืžืงื•ืจื™ืช.

ืœื”ืœืŸ ืงื•ื‘ืฅ ืœื“ื•ื’ืžื” ืขื ื ืชื•ื ื™ ืงืœื˜:

> 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

ื–ื” ืื•ืœื™ ืœื ื‘ืจื•ืจ ืžื”ืชื™ืื•ืจ ืœืžืขืœื”, ืื‘ืœ ืื ื—ื ื• ืžืขื•ื ื™ื™ื ื™ื ืจืง ื‘ืชื’ื•ื‘ื” ื”ืจืืฉื•ื ื” // VCL.SHOW, ื•ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ื›ืžื” ืžื”ื ื‘ื ืชื•ื ื™ ื”ืงืœื˜. ื–ื• ื”ืกื™ื‘ื” ืฉื”-awk ื”ืžืงื•ืจื™ ืžืกืชื™ื™ื ืœืื—ืจ ื”ื”ืชืืžื” ื”ืจืืฉื•ื ื”.

# ัˆะฐะณ ะฟะตั€ะฒั‹ะน, ะฒั‹ะฒะตัั‚ะธ ั‚ะพะปัŒะบะพ ัั‚ั€ะพะบะธ ั ะบะพะผะผะตะฝั‚ะฐั€ะธัะผะธ
# ะธัะฟะพะปัŒะทัƒั ะฒะพะทะผะพะถะฝะพัั‚ะธ 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

ืื– ื”ืชื•ื›ืŸ ืฉืœ ืกืงืจื™ืคื˜ varnishreload ื™ื™ืจืื” ื‘ืขืจืš ื›ืš:

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

ื ื™ืชืŸ ืœืกื›ื ืืช ื”ื”ื™ื’ื™ื•ืŸ ืœืขื™ืœ ื›ืš:
ืื ืžื—ืจื•ื–ืช ืชื•ืืžืช ืœื‘ื™ื˜ื•ื™ ืจื’ื•ืœืจื™ // VCL.SHOW, ื•ืื– ืœื˜ืจื•ืฃ ื‘ื—ืžื“ื ื•ืช ืืช ื”ื˜ืงืกื˜ ืฉื›ื•ืœืœ ืืช ืฉื ื™ ื”ืžืกืคืจื™ื ื‘ืื•ืชื” ืฉื•ืจื”, ื•ืœืฉืžื•ืจ ืืช ื›ืœ ืžื” ืฉื ืฉืืจ ืœืื—ืจ ื”ืคืขื•ืœื” ื”ื–ื•. ื”ื ืคืง ืืช ื”ืขืจืš ื”ืžืื•ื—ืกืŸ ื•ืกื™ื™ื ืืช ื”ืชื•ื›ื ื™ืช.

ืคืฉื•ื˜, ืœื?

ื”ื™ื™ื ื• ืžืจื•ืฆื™ื ืžื”ืชืกืจื™ื˜ ืฉืœ sed ื•ืžื”ืขื•ื‘ื“ื” ืฉื”ื•ื ืžื—ืœื™ืฃ ืืช ื›ืœ ื”ืงื•ื“ ื”ืžืงื•ืจื™. ื›ืœ ื”ื‘ื“ื™ืงื•ืช ืฉืœื™ ื ืชื ื• ืืช ื”ืชื•ืฆืื•ืช ื”ืจืฆื•ื™ื•ืช, ืื– ืฉื™ื ื™ืชื™ ืืช ื”-"varnishreload" ื‘ืฉืจืช ื•ืจืฆืชื™ ืฉื•ื‘ systemctl reload varnish. ื˜ืขื•ืช ืžื˜ื•ื ืคืช echo: write error: Broken pipe ืฉื•ื‘ ืฆื—ืง ื‘ืคื ื™ื ื•. ืกืžืŸ ืงื•ืจืฅ ื—ื™ื›ื” ืœื”ื–ื ืช ืคืงื•ื“ื” ื—ื“ืฉื” ื‘ืจื™ืง ื”ืืคืœ ืฉืœ ื”ื˜ืจืžื™ื ืœ...

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”