Falling Down the Rabbit Hole: The story of one varnish reboot error - 1 කොටස

ghostinushka, ඔහුගේ ජීවිතය රඳා පවතින්නේ එය මත මෙන් පෙර මිනිත්තු 20 තුළ බොත්තම් අතැතිව, ඔහුගේ ඇස්වල අර්ධ වල් බැල්මක් සහ කපටි සිනහවකින් මා දෙසට හැරේ - "මචං, මම හිතන්නේ මට තේරුණා."

"මෙන්න බලන්න," ඔහු පවසන්නේ, තිරයේ ඇති එක් සංකේතයක් පෙන්වමින්, "මම මගේ රතු තොප්පිය ඔට්ටු අල්ලනවා, මම ඔබට එවූ දේ අපි මෙහි එකතු කළහොත්," තවත් කේතයේ කොටසක් පෙන්වමින්, "දෝෂය තවදුරටත් සිදු නොවනු ඇත. පෙන්වනු ඇත."

ටිකක් ප්‍රහේලිකාවක් සහ මහන්සියක්, මම කාලයක් තිස්සේ අපි වැඩ කරමින් සිටි sed ප්‍රකාශනය වෙනස් කර, ගොනුව සුරැකීමට සහ ධාවනය කරන්න systemctl varnish reload. දෝෂ පණිවිඩය අතුරුදහන් වී ඇත...

“මම අපේක්ෂකයා සමඟ හුවමාරු කරගත් විද්‍යුත් තැපෑල,” මගේ සගයා තවදුරටත් පැවසීය, ඔහුගේ සිනහව සැබෑ ප්‍රීති සිනහවක් බවට පත් වූ විට, “මෙය හරියටම එකම ගැටලුව බව මට හදිසියේම වැටහුණි!”

ඒ සියල්ල ආරම්භ වූ ආකාරය

ලිපිය bash, awk, sed සහ systemd ක්‍රියා කරන ආකාරය පිළිබඳ අවබෝධයක් උපකල්පනය කරයි. වාර්නිෂ් පිළිබඳ දැනුම වඩාත් කැමති නමුත් අවශ්ය නොවේ.
කොටස්වල කාල මුද්දර වෙනස් කර ඇත.
සමඟ ලියා ඇත ghostinushka.
මෙම පාඨය සති දෙකකට පෙර ඉංග්‍රීසියෙන් පළ වූ මුල් පිටපතේ පරිවර්තනයකි; පරිවර්තනය බොයිකෝඩන්.

තවත් උණුසුම් සරත් උදෑසනක පරිදර්ශක ජනේල හරහා හිරු බබළයි, නැවුම් ලෙස සකස් කළ කැෆේන් බහුල බීම කෝප්පයක් යතුරුපුවරුවෙන් ඉවතට රැඳේ, ඔබේ ප්‍රියතම ශබ්ද සංධ්වනිය ඔබේ හෙඩ්ෆෝන්වල ශබ්ද කරයි, යාන්ත්‍රික යතුරුපුවරු වල රස්තියාදුව යටපත් කරයි, සහ පළමු පිවිසුම කන්බන් පුවරුවේ ඇති පසුබැසීම ප්‍රවේශපත්‍ර ලැයිස්තුවේ “වාර්නිශ්‍රේලෝඩ් පරීක්‍ෂා කරන්න” sh: echo: I/O වේදිකාගත කිරීමේදී දෝෂය” (වේදිකාගත කිරීමේදී “varnishreload sh: echo: I/O දෝෂය” විමර්ශනය කරන්න) යන දෛවෝපගත මාතෘකාවෙන් සෙල්ලක්කාර ලෙස දිදුලයි. වාර්නිෂ් සම්බන්ධයෙන් ගත් කල, මෙම අවස්ථාවේ දී මෙන් කිසිදු ගැටළුවක් ඇති නොවුනත්, දෝෂ සඳහා කිසිදු ඉඩක් ඇත සහ තිබිය නොහැක.

නොදන්නා අය සඳහා වාර්නිෂ්රේලෝඩ්, මෙය වින්‍යාසය නැවත පූරණය කිරීමට භාවිතා කරන සරල shell script එකකි වාර්නිෂ් - VCL ලෙසද හැඳින්වේ.

ප්‍රවේශ පත්‍රයේ මාතෘකාවෙන් පෙනෙන පරිදි, වේදිකාවේ ඇති එක් සේවාදායකයක දෝෂය ඇති වූ අතර, වේදිකාවේ වාර්නිෂ් මාර්ගගත කිරීම නිසි ලෙස ක්‍රියාත්මක වන බව මට විශ්වාස බැවින්, මෙය සුළු දෝෂයක් වනු ඇතැයි මම උපකල්පනය කළෙමි. එබැවින්, දැනටමත් වසා ඇති ප්‍රතිදාන ප්‍රවාහයකින් අවසන් වූ පණිවිඩයක් පමණි. මම ටිකට් පත මා වෙනුවෙන්ම ගන්නවා, මම එය විනාඩි 30කට අඩු කාලයකින් එය සූදානම් කර ඇති බවට පූර්ණ විශ්වාසයකින් යුතුව, තවත් කුණු කසළ ඉවත් කිරීම සඳහා මගේ පිටට තට්ටු කර වඩා වැදගත් කරුණු වෙත ආපසු යන්නෙමි.

පැයට කිලෝමීටර 200 ක වේගයෙන් තාප්පයක ගැටීම

ගොනුව විවෘත කිරීම varnishreload, Debian Stretch ධාවනය වන එක් සේවාදායකයක, මම පේළි 200 ට වඩා අඩු shell script එකක් දුටුවෙමි.

ස්ක්‍රිප්ට් එක හරහා ගිය පසු, ටර්මිනලයේ සිට එය කිහිප වතාවක් ක්‍රියාත්මක කිරීමේදී ගැටලු ඇති විය හැකි කිසිවක් මා දුටුවේ නැත.

කොහොමටත් මේක වේදිකාවක්, කැඩිලා ගියත් කවුරුවත් මැසිවිලි නඟන්නේ නැහැ, හොඳයි... වැඩිය නැහැ. මම ස්ක්‍රිප්ට් එක ධාවනය කර ටර්මිනලයට ලියා ඇත්තේ කුමක්දැයි බලන්න, නමුත් දෝෂ තවදුරටත් නොපෙනේ.

කිසිදු අමතර උත්සාහයකින් තොරව මට දෝෂය ප්‍රතිනිෂ්පාදනය කළ නොහැකි බව තහවුරු කර ගැනීමට තවත් යුවලක් ධාවනය වන අතර, මම මෙම ස්ක්‍රිප්ට් වෙනස් කර එය තවමත් දෝෂයක් ඇති කරන්නේ කෙසේදැයි සොයා බැලීමට පටන් ගනිමි.

ස්ක්‍රිප්ටයට STDOUT අභිබවා යා හැකිද (භාවිතා කරමින් > &-)? නැත්නම් STDERR? මේ දෙකෙන් එකක්වත් අන්තිමට වැඩ කළේ නැහැ.

පෙනෙන විදිහට systemd කෙසේ හෝ ආරම්භක පරිසරය වෙනස් කරයි, නමුත් කෙසේද සහ ඇයි?
මම vim විවෘත කර සංස්කරණය කරමි varnishreload, එකතු කිරීම set -x හරියටම shebang යටතේ, ස්ක්‍රිප්ටයේ නිදොස් කිරීමේ ප්‍රතිදානය යම් ආලෝකයක් ලබා දෙනු ඇතැයි බලාපොරොත්තු වේ.

ගොනුව නිවැරදි කර ඇත, එබැවින් මම වාර්නිෂ් නැවත පූරණය කරන අතර වෙනස සම්පූර්ණයෙන්ම බිඳ දැමූ බව මම දකිමි ... පිටාර ගැලීම සම්පූර්ණ අවුල් ජාලයකි, එහි C-වැනි කේතය ටොන් ගණනක් ඇත. ටර්මිනලයේ අනුචලනය කිරීම පවා එය ආරම්භ වන ස්ථානය සොයා ගැනීමට ප්රමාණවත් නොවේ. මම සම්පූර්ණයෙන්ම අවුල් සහගතයි. දෝශ නිරාකරණ මාදිලිය ස්ක්‍රිප්ට් එකක දියත් කරන ලද වැඩසටහන් වල ක්‍රියාකාරිත්වයට බලපෑ හැකිද? නැහැ, ඒක විකාරයක්. කවචයේ දෝෂයක්ද? විය හැකි අවස්ථා කිහිපයක් කැරපොත්තන් විවිධ දිශාවලට මගේ හිස හරහා දිව යයි. කැෆේන් සහිත බීම කෝප්පය ක්ෂණිකව හිස් වී ඇත, කොටස් නැවත පිරවීම සඳහා කුස්සියට ඉක්මන් ගමනක් සහ ... අපි යන්නෙමු. මම ස්ක්‍රිප්ට් එක විවෘත කර ෂෙබාන්ග් දෙස සමීපව බලමි: #!/bin/sh.

/bin/sh - මෙය bash කිරීමට ඇති symlink එකක් පමණි, ඒ නිසා script එක POSIX-අනුකූල ප්‍රකාරයට අර්ථ දක්වනවා නේද? එහෙම නෑ! ඩේබියන් හි පෙරනිමි කවචය ඩෑෂ් වන අතර එය හරියටම පෙනෙන්නේ එයයි. යොමු කරයි /bin/sh.

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

පරීක්ෂණයක් ලෙස, මම shebang වෙනස් කළා #!/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-style විවරණ භාවිතා කරනු ලබන අතර, පහත දැක්වෙන කේත ස්නිපට් පේළිය එයයි.
ඇතුළත් ගොනු විස්තර කරන අදහස් සඳහා වාක්‍ය ඛණ්ඩය පහත ආකෘතියෙන් ඇත:

// 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 දැනටමත් හය වතාවක් කල් ඉකුත් වී ඇති අතර, ඊට අමතරව, අනෙකුත් කරුණු පසෙකට තල්ලු කරමින් ඉහළ ප්‍රමුඛතා කාර්යයක් දර්ශනය වී ඇත. සතියේ ඉතිරි කාලය විවිධ කර්තව්‍යයන්ගෙන් පිරී තිබූ අතර sed පිළිබඳ වාර්තාවක් සහ අපේක්ෂකයෙකු සමඟ සම්මුඛ සාකච්ඡාවකින් පමණක් තරමක් තනුක විය. දෝෂය සමඟ ගැටළුව varnishreload ආපසු හැරවිය නොහැකි ලෙස කාලයේ වැලිතලාවේ ගිලිහී ගියේය.

ඔබේ ඊනියා sed-fu... ඇත්තටම... කුණු

ඊළඟ සතියේ මට තරමක් නිදහස් දිනයක් ලැබුණි, එබැවින් මම මෙම ටිකට් පත නැවත ලබා ගැනීමට තීරණය කළෙමි. මගේ මොළයේ, කිසියම් පසුබිම් ක්‍රියාවලියක් මේ කාලය පුරාම මෙම ගැටලුවට විසඳුමක් සොයමින් සිටි බවත්, මෙවර සිදුවෙමින් පවතින දේ මට නිසැකවම වැටහෙනු ඇතැයි මම බලාපොරොත්තු වෙමි.

සරලව කේතය වෙනස් කිරීම අවසන් වරට උදව් නොකළ නිසා, මම එය 116 පේළියේ සිට නැවත ලිවීමට තීරණය කළෙමි. කොහොමත් තියෙන කෝඩ් එක මෝඩයි. තවද එය භාවිතා කිරීම සම්පූර්ණයෙන්ම අවශ්ය නොවේ read.

දෝෂය දෙස නැවත බලන්න:
sh: echo: broken pipe — echo මෙම විධානයේ ස්ථාන දෙකකින් දිස්වේ, නමුත් පළමුවැන්න වැඩි විය හැකි වැරදිකරු (හෝ අවම වශයෙන් හවුල්කරුවෙකු) යැයි මම සැක කරමි. Awk විශ්වාසය ඇති නොකරයි. සහ එය ඇත්තෙන්ම එසේ නම් awk | {read; echo} සැලසුම මෙම සියලු ගැටළු වලට මග පාදයි, එය ප්‍රතිස්ථාපනය නොකරන්නේ මන්ද? මෙම තනි පේළි විධානය awk හි සියලුම විශේෂාංග භාවිතා නොකරයි, සහ මෙම අමතර එක පවා read අතිරෙකව.

පසුගිය සතියේ සිට වාර්තාවක් තිබුණා sed, මට අවශ්‍ය වූයේ මගේ අලුතින් ලබාගත් කුසලතා උත්සාහ කර සරල කිරීමටයි echo | awk | { read; echo} වඩාත් තේරුම් ගත හැකි බවට echo | sed. මෙය නියත වශයෙන්ම දෝෂය හඳුනා ගැනීම සඳහා හොඳම ප්‍රවේශය නොවන නමුත්, මම අවම වශයෙන් මගේ sed-fu උත්සාහ කර ගැටලුව ගැන අලුත් යමක් ඉගෙන ගැනීමට සිතුවෙමි. අතරමගදී, මම මගේ සගයා, sed talk හි කතුවරයාගෙන් වඩාත් කාර්යක්ෂම sed පිටපතක් ඉදිරිපත් කිරීමට මට උදව් කරන ලෙස ඉල්ලා සිටියෙමි.

මම අන්තර්ගතය අතහැර දැමුවෙමි varnishadm vcl.show -v "$VCL_NAME" ගොනුවකට, එබැවින් මට සේවා නැවත පණගැන්වීමේ කරදරයකින් තොරව sed ස්ක්‍රිප්ට් ලිවීම කෙරෙහි අවධානය යොමු කළ හැකිය.

sed ක්‍රියාවලි ආදානය හරියටම සොයා ගත හැකි ආකාරය පිළිබඳ කෙටි විස්තරයක් ඔහුගේ GNU අත්පොත. sed මූලාශ්රවල සංකේතය n රේඛා බෙදුම්කරුවෙකු ලෙස පැහැදිලිව දක්වා ඇත.

සාමාර්ථ කිහිපයකදී සහ මගේ සගයාගේ නිර්දේශ සහිතව, අපි සම්පූර්ණ මුල් පේළිය 116 ට සමාන ප්‍රතිඵලයක් ලබා දුන් sed පිටපතක් ලිව්වෙමු.

ආදාන දත්ත සහිත නියැදි ගොනුවක් පහත දැක්වේ:

> 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, සහ ආදාන දත්තවල ඒවායින් කිහිපයක් තිබිය හැක. මුල් තරගයෙන් පසු මුල් අවුක් අවසන් වන්නේ එබැවිනි.

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

එබැවින්, වාර්නිෂ්රේලෝඩ් ස්ක්‍රිප්ට් එකේ අන්තර්ගතය මේ වගේ දෙයක් පෙනෙනු ඇත:

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

ඉහත තර්කය කෙටියෙන් මෙසේ දැක්විය හැක.
තන්තුව සාමාන්‍ය ප්‍රකාශනයකට ගැලපේ නම් // VCL.SHOW, ඉන්පසු මෙම පේළියේ අංක දෙකම ඇතුළත් පෙළ කෑදර ලෙස ගිල දමන්න, සහ මෙම මෙහෙයුමෙන් පසු ඉතිරිව ඇති සියල්ල සුරකින්න. ගබඩා කර ඇති අගය නිකුත් කර වැඩසටහන අවසන් කරන්න.

සරලයි නේද?

sed පිටපත සහ එය සියලු මුල් කේතය ප්‍රතිස්ථාපනය කිරීම ගැන අපි සතුටු වුණා. මගේ සියලුම පරීක්ෂණ අපේක්ෂිත ප්‍රතිඵල ලබා දුන් නිසා මම සේවාදායකයේ “වාර්නිශ්‍රේලෝඩ්” වෙනස් කර නැවත ධාවනය කළෙමි. systemctl reload varnish. නරක වැරැද්දක් echo: write error: Broken pipe ආයෙත් අපේ මූණට හිනා. ඇසිපිය හෙළන කර්සරය ටර්මිනලයේ අඳුරු හිස්බව තුළ නව විධානයක් ඇතුල් කරන තෙක් බලා සිටියේය...

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න