ஃபாலிங் டவுன் தி ராபிட் ஹோல்: ஒரு வார்னிஷ் ரீபூட் பிழையின் கதை - பகுதி 1

கோஸ்டினுஷங்கா, முந்தைய 20 நிமிடங்களுக்கு அவரது வாழ்க்கை அதைச் சார்ந்தது போல் பட்டன்களை அழுத்திய பிறகு, அவரது கண்களில் ஒரு அரை காட்டு வெளிப்பாடு மற்றும் ஒரு தந்திரமான சிரிப்புடன் - "நண்பா, நான் புரிந்துகொள்கிறேன் என்று நினைக்கிறேன்."

"இங்கே பார்," என்று அவர் கூறுகிறார், திரையில் உள்ள ஒரு பாத்திரத்தை சுட்டிக்காட்டி, "நான் உங்களுக்கு அனுப்பியதை இங்கே சேர்த்தால், என் சிவப்பு தொப்பியை நான் பந்தயம் கட்டுகிறேன்" - குறியீட்டின் மற்றொரு பகுதியை சுட்டிக்காட்டி - "பிழை இனி நடக்காது. காட்டப்படும்."

கொஞ்சம் குழப்பமாகவும் சோர்வாகவும், நாங்கள் சிறிது காலமாக வேலை செய்து கொண்டிருந்த sed அறிக்கையை மாற்றி, கோப்பைச் சேமித்து, இயக்கவும் systemctl varnish reload. பிழை செய்தி மறைந்துவிட்டது...

"வேட்பாளருடன் நான் பரிமாறிய மின்னஞ்சல்கள்," என் சக ஊழியர் தொடர்ந்தார், அவரது சிரிப்பு மகிழ்ச்சி நிறைந்த உண்மையான புன்னகையாக மாறியது, "இதுவும் அதே பிரச்சனை என்று எனக்கு திடீரென்று தோன்றியது!"

இது எல்லாம் எப்படி தொடங்கியது

bash, awk, sed மற்றும் systemd ஆகியவை எவ்வாறு செயல்படுகின்றன என்பதைப் பற்றிய புரிதலை கட்டுரை கருதுகிறது. வார்னிஷ் பற்றிய அறிவு விரும்பத்தக்கது ஆனால் தேவையில்லை.
துணுக்குகளில் நேரமுத்திரைகள் மாற்றப்பட்டுள்ளன.
உடன் எழுதப்பட்டது கோஸ்டினுஷங்கா.
இந்த உரை இரண்டு வாரங்களுக்கு முன்பு ஆங்கிலத்தில் வெளியிடப்பட்ட மூலத்தின் மொழிபெயர்ப்பு; மொழிபெயர்ப்பு பாய்கோடன்.

மற்றொரு சூடான இலையுதிர்கால காலை நேரத்தில் சூரியன் பனோரமிக் ஜன்னல்கள் வழியாக பிரகாசிக்கிறது, புதிதாக காய்ச்சப்பட்ட காஃபினேட்டட் பானம் ஒரு கப் கீபோர்டின் பக்கத்தில் உள்ளது, மெக்கானிக்கல் கீபோர்டுகளின் சலசலப்பில் ஹெட்ஃபோன்களில் ஒலிகளின் விருப்பமான சிம்பொனி ஒலிக்கிறது மற்றும் முதல் நுழைவு கான்பன் போர்டில் உள்ள பேக்லாக் டிக்கெட்டுகளின் பட்டியல் "வார்னிஷ்ரேலோட் sh: எதிரொலி: ஸ்டேஜிங்கில் உள்ள I/O பிழையை விசாரிக்கவும்" (ஸ்டேஜிங்கில் "varnishreload sh: echo: I/O பிழை" என்று விசாரிக்கவும்) என்ற தலைப்பில் விளையாட்டுத்தனமாக ஒளிர்கிறது. இது வார்னிஷ் வரும்போது, ​​எந்த தவறும் இல்லை மற்றும் இருக்க முடியாது, அவை எந்த பிரச்சனையும் ஏற்படாவிட்டாலும், இந்த விஷயத்தில் உள்ளது.

அறிமுகம் இல்லாதவர்களுக்கு வார்னிஷ்ரேலோட், இது ஒரு எளிய ஷெல் ஸ்கிரிப்ட் ஆகும், இது கட்டமைப்பை மீண்டும் ஏற்ற பயன்படுகிறது வார்னிஷ் - VCL என்றும் அழைக்கப்படுகிறது.

டிக்கெட்டின் தலைப்பு குறிப்பிடுவது போல, மேடையில் உள்ள சர்வரில் பிழை ஏற்பட்டது, மேலும் மேடையில் வார்னிஷ் ரூட்டிங் சரியாக வேலை செய்கிறது என்று நான் நம்பியதால், இது ஒரு சிறிய தவறு என்று நான் கருதினேன். எனவே, ஏற்கனவே மூடப்பட்ட வெளியீட்டு ஸ்ட்ரீமில் வந்த ஒரு செய்தி. 30 நிமிடங்களுக்குள் அதை தயார் செய்துவிடுவேன் என்ற முழு நம்பிக்கையுடன் எனக்காக ஒரு டிக்கெட்டை எடுத்துக்கொள்கிறேன், அடுத்த குப்பையின் பலகையைத் துடைக்க தோளில் என்னைத் தட்டிக் கொண்டு மேலும் முக்கியமான விஷயங்களுக்குத் திரும்புவேன்.

மணிக்கு 200 கிமீ வேகத்தில் சுவரில் மோதியது

ஒரு கோப்பை திறக்கிறது varnishreload, Debian Stretch இயங்கும் சர்வர் ஒன்றில், 200 வரிகளுக்கும் குறைவான நீளமுள்ள ஷெல் ஸ்கிரிப்டைப் பார்த்தேன்.

ஸ்கிரிப்ட் மூலம் இயங்கும் போது, ​​டெர்மினலில் இருந்து நேரடியாக பலமுறை இயக்கும்போது சிக்கல்களை ஏற்படுத்தக்கூடிய எதையும் நான் பார்க்கவில்லை.

எல்லாவற்றிற்கும் மேலாக, இது ஒரு கட்டம், உடைந்தாலும், யாரும் குறை சொல்ல மாட்டார்கள், சரி... மிகையாகாது. நான் ஸ்கிரிப்டை இயக்கி, டெர்மினலில் என்ன எழுதப்படும் என்பதைப் பார்க்கிறேன், ஆனால் பிழைகள் இனி தெரியவில்லை.

சில கூடுதல் முயற்சிகள் இல்லாமல் பிழையை மீண்டும் உருவாக்க முடியாது என்பதை உறுதிப்படுத்த இன்னும் இரண்டு ரன்கள் எடுத்தேன், மேலும் இந்த ஸ்கிரிப்டை எவ்வாறு மாற்றுவது மற்றும் அதை இன்னும் பிழையாக மாற்றுவது எப்படி என்பதைக் கண்டுபிடிக்கத் தொடங்குகிறேன்.

ஸ்கிரிப்ட் STDOUT ஐத் தடுக்க முடியுமா (பயன்படுத்துதல் > &-)? அல்லது STDERR? இரண்டுமே இறுதியில் வேலை செய்யவில்லை.

வெளிப்படையாக systemd ரன் சூழலை ஏதோ ஒரு வகையில் மாற்றுகிறது, ஆனால் எப்படி, ஏன்?
நான் விம்மை ஆன் செய்து திருத்துகிறேன் varnishreload, சேர்த்து set -x ஷெபாங்கின் கீழ், ஸ்கிரிப்ட்டின் வெளியீட்டில் பிழைத்திருத்தம் சிறிது வெளிச்சம் தரும் என்று நம்புகிறோம்.

கோப்பு சரி செய்யப்பட்டது, அதனால் நான் வார்னிஷ் மீண்டும் ஏற்றுகிறேன் மற்றும் மாற்றம் முற்றிலும் எல்லாவற்றையும் உடைத்துவிட்டது என்று பார்க்கிறேன் ... எக்ஸாஸ்ட் ஒரு முழுமையான குழப்பம், அதில் டன் சி போன்ற குறியீடு உள்ளது. டெர்மினலில் ஸ்க்ரோலிங் செய்வது கூட அது எங்கு தொடங்குகிறது என்பதைக் கண்டுபிடிக்க போதாது. நான் முற்றிலும் குழம்பிவிட்டேன். பிழைத்திருத்த பயன்முறை ஸ்கிரிப்ட்டில் இயங்கும் நிரல்களின் வேலையை பாதிக்குமா? இல்லை, முட்டாள்தனம். ஷெல் உள்ள பிழை? வெவ்வேறு திசைகளில் கரப்பான் பூச்சிகள் போல் பல சாத்தியமான காட்சிகள் என் தலையில் பறக்கின்றன. ஒரு கப் காஃபின் நிறைந்த பானம் ஒரு நொடியில் காலியாகி விடுகிறது, மீண்டும் சப்ளைக்காக சமையலறைக்கு ஒரு விரைவான பயணம் மற்றும்… போகலாம். நான் ஸ்கிரிப்டைத் திறந்து ஷெபாங்கைக் கூர்ந்து கவனிக்கிறேன்: #!/bin/sh.

/bin/sh - இது ஒரு பாஷ் சிம்லிங்க், எனவே ஸ்கிரிப்ட் 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 உள்ளமைவு பெரும்பாலும் பல கோப்புகளிலிருந்து ஒன்றாக இணைக்கப்படலாம் என்பதைப் புரிந்துகொள்வது அவசியம். ஒரு உள்ளமைவு கோப்பு மற்றொன்றில் எங்கு சேர்க்கப்பட்டுள்ளது என்பதை வரையறுக்க சி-பாணி கருத்துகள் பயன்படுத்தப்படுகின்றன, மேலும் இதுவே பின்வரும் குறியீடு துணுக்கைப் பற்றியது.
சேர்க்கப்பட்ட கோப்புகளை விவரிக்கும் கருத்துகளுக்கான தொடரியல் பின்வரும் வடிவமைப்பைக் கொண்டுள்ளது:

// 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. பிழையைப் பிடிப்பதற்கான சிறந்த அணுகுமுறை இதுவல்ல என்றாலும், குறைந்தபட்சம் எனது செட்-ஃபூவை முயற்சித்து, சிக்கலைப் பற்றி புதிதாக ஏதாவது கற்றுக்கொள்ளலாம் என்று நினைத்தேன். வழியில், எனது சக ஊழியரான செட் டாக் எழுத்தாளரிடம், மிகவும் திறமையான செட் ஸ்கிரிப்டைக் கொண்டு வர எனக்கு உதவுமாறு கேட்டேன்.

நான் உள்ளடக்கத்தை கைவிட்டேன் varnishadm vcl.show -v "$VCL_NAME" ஒரு கோப்பில் சேர்ஸ் ஸ்கிரிப்டை எழுதுவதில் நான் கவனம் செலுத்த முடியும், சேவை மறுதொடக்கம் எந்த தொந்தரவும் இல்லாமல்.

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

எனவே வார்னிஷ்ரேலோட் ஸ்கிரிப்ட்டின் உள்ளடக்கங்கள் இப்படி இருக்கும்:

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

மேலே உள்ள தர்க்கத்தை பின்வருமாறு சுருக்கமாகக் கூறலாம்:
சரம் வழக்கமான வெளிப்பாட்டுடன் பொருந்தினால் // VCL.SHOW, பின்னர் அந்த வரியில் உள்ள இரண்டு எண்களையும் உள்ளடக்கிய உரையை பேராசையுடன் தின்று, இந்த செயல்பாட்டிற்குப் பிறகு எஞ்சியிருப்பதைச் சேமிக்கவும். சேமிக்கப்பட்ட மதிப்பை வெளியிட்டு நிரலை முடிக்கவும்.

எளிமையானது, இல்லையா?

செட் ஸ்கிரிப்ட் மற்றும் அது அசல் குறியீடு அனைத்தையும் மாற்றியமைத்ததில் நாங்கள் மகிழ்ச்சியடைந்தோம். எனது அனைத்து சோதனைகளும் விரும்பிய முடிவுகளைக் கொடுத்தன, எனவே சர்வரில் உள்ள "வார்னிஷ்ரேலோடை" மாற்றி மீண்டும் இயக்கினேன் systemctl reload varnish. அசிங்கமான தவறு echo: write error: Broken pipe மீண்டும் எங்கள் முகத்தில் சிரித்தது. முனையத்தின் இருண்ட வெற்றிடத்தில் ஒரு புதிய கட்டளையை உள்ளிடுவதற்கு கண் சிமிட்டும் கர்சர் காத்திருந்தது...

ஆதாரம்: www.habr.com

கருத்தைச் சேர்