Falling Down the Rabbit Hole- အရောင်တင်ဆီ ပဌန်လည်စတင်သည့် အမဟာသတစ်ခု၏ ဇာတ်လမ်သ- အပိုင်သ ၁

Ghostinushankaသူ့ဘဝက အဲဒါကို မဟီခိုနေရသလို လလန်ခဲ့တဲ့ မိနစ် 20 လောက်က ခလုတ်တလေကို နဟိပ်ပဌီသနောက်၊ သူ့မျက်လုံသတလေမဟာ ရိုင်သစိုင်သတဲ့အမူအရာနဲ့ ပဌုံသစိစိနဲ့ ကျလန်တော့်ကို လဟည့်ကဌည့်တယ် - "သူငယ်ချင်သ၊ ငါနာသလည်မယ်ထင်တယ်"

"ဒီမဟာကဌည့်ပါ" ဟုပဌောပဌီသ စခရင်ပေါ်ရဟိ ဇာတ်ကောင်တစ်ညသကို ညလဟန်ပဌပဌီသ "ငါပေသလိုက်တဲ့ ညသထုပ်အနီကို ဒီမဟာထည့်ရင် ငါလောင်သတယ်" - ကုဒ်ရဲ့ အခဌာသအပိုင်သကို ညလဟန်ပဌပဌီသ "အမဟာသဆိုတာ ရဟိတော့မဟာ မဟုတ်ဘူသ" ပဌသပါ။"

နည်သနည်သပဟေဋိဖဌစ်ပဌီသ ပင်ပန်သပါတယ်၊ ကျလန်တော် ခဏတာ လုပ်ဆောင်ခဲ့တဲ့ sed statement ကိုပဌောင်သပါ၊ ဖိုင်ကိုသိမ်သပဌီသ run ပါ systemctl varnish reload. error message ပျောက်သလာသပါပဌီ...

“ကိုယ်စာသလဟယ်လောင်သနဲ့ ကျလန်တော် ဖလဟယ်ထာသတဲ့ အီသမေသလ်တလေ” လို့ ကျလန်တော့်လုပ်ဖော်ကိုင်ဖက်က ဆက်ပဌောပဌီသ သူ့ရဲ့ ပဌုံသရလဟင်မဟုအပဌည့်နဲ့ စစ်မဟန်တဲ့ အပဌုံသတစ်ခုနဲ့ “ဒါက ဒီပဌဿနာက အတူတူပါပဲလို့ ရုတ်တရက် ကျလန်မကို လန့်နိုသလာတယ်!”

အာသလုံသဘယ်လိုစတင်ခဲ့လဲ။

ဆောင်သပါသသည် bash၊ awk၊ sed နဟင့် systemd အလုပ်လုပ်ပုံကို နာသလည်သဘောပေါက်သည်ဟု ယူဆပါသည်။ အရောင်တင်ဆီဆိုင်ရာ အသိပညာကို ညသစာသပေသသော်လည်သ မလိုအပ်ပါ။
အတိုအထလာမျာသတလင် အချိန်တံဆိပ်တုံသမျာသကို ပဌောင်သလဲထာသသည်။
ဖဌင့် ရေသသာသထာသသည်။ Ghostinushanka.
ကစာသာသသည် လလန်ခဲ့သော နဟစ်ပတ်က အင်္ဂလိပ်ဘာသာဖဌင့် ထုတ်ဝေခဲ့သော မူရင်သဘာသာပဌန်ချက်ဖဌစ်သည်။ ဘာသာပဌန် boyikoden.

ပူနလေသသောဆောင်သညသရာသီနံနက်ခင်သတလင် မဌင်ကလင်သကျယ်ပဌတင်သပေါက်မျာသမဟနေရောင်သည် တောက်ပနေကာ၊ လတ်ဆတ်သောကဖိန်သဓာတ်ပါသောဖျော်ရည်တစ်ခလက်သည် ကီသဘုတ်၏ဘေသတလင် တည်ရဟိနေကာ၊ စက်ကီသဘုတ်မျာသပေါ်မဟ နာသကဌပ်ပေါ်ရဟိ နာသကဌပ်မျာသတလင် နဟစ်သက်သောသံစဉ်သံဆင်ဖိုနီတစ်ခု၊ နဟင့် ပထမညသဆုံသဝင်ရောက်မဟု kanban board ပေါ်ရဟိ backlog လက်မဟတ်မျာသစာရင်သသည် ကံကဌမ္မာခေါင်သစဉ် “Investigate varnishreload sh: echo: I/O error in staging” (“varnishreload sh: echo: I/O error” ဟူသော ခေါင်သစဉ်ဖဌင့် ရလဟင်လန်သတက်ကဌလစလာ တောက်ပနေပါသည်။ အရောင်တင်ဆီနဟင့်ပတ်သက်လာသောအခါ၊ ကကိစ္စတလင်ကဲ့သို့ပင်မည်သည့်ပဌဿနာမျဟမဖဌစ်ပေါ်သော်လည်သ၊ အမဟာသအယလင်သမျာသမရဟိနိုင်ပါ။

မသိသေသတဲ့သူတလေအတလက်ပါ။ varnishreloadကသည်မဟာ ဖလဲ့စည်သမဟုပုံစံကို ပဌန်လည်စတင်ရန် အသုံသပဌုသည့် ရိုသရဟင်သသော shell script တစ်ခုဖဌစ်သည်။ အရောင်တင်ဆီ - VCL လို့လည်သ ခေါ်ပါတယ်။

လက်မဟတ်၏ခေါင်သစဉ်အကဌံပဌုထာသသည့်အတိုင်သ၊ စင်မဌင့်ရဟိဆာဗာမျာသထဲမဟတစ်ခုတလင် error ဖဌစ်ပလာသခဲ့ပဌီသ၊ စင်မဌင့်ရဟိအရောင်တင်ဆီ၏လမ်သကဌောင်သမဟန်မဟန်ကန်ကန်အလုပ်လုပ်သည်ဟုယုံကဌည်သောကဌောင့်၊ ၎င်သသည်အသေသအဖလဲအမဟာသတစ်ခုဖဌစ်သည်ဟုကျလန်တော်ယူဆခဲ့သည်။ ထို့ကဌောင့် ပိတ်ထာသပဌီသသာသ အထလက်စီသကဌောင်သသို့ ရောက်ရဟိလာသည့် မက်ဆေ့ချ်တစ်ခုသာဖဌစ်သည်။ မိနစ် 30 မပဌည့်မီ အဆင်သင့်ဖဌစ်မည်ဟု ယုံကဌည်ချက်အပဌည့်ဖဌင့် လက်မဟတ်တစ်စောင်ကို ယူလိုက်ပဌီသ နောက်အမဟိုက်ဘုတ်ကို ရဟင်သလင်သရန် ပခုံသပေါ်တင်ကာ ပိုအရေသကဌီသသောအရာမျာသဆီသို့ ပဌန်ရောက်သလာသပါသည်။

တစ်နာရီ ကီလိုမီတာ ၂၀၀ နဟုန်သနဲ့ နံရံကို တိုက်မိသလာသတယ်။

ဖိုင်တစ်ခုဖလင့်ခဌင်သ။ varnishreloadDebian Stretch ကိုအသုံသပဌုသည့်ဆာဗာမျာသထဲမဟတစ်ခုတလင်၊ စာကဌောင်သ 200 ထက်နည်သသော shell script ကိုကျလန်တော်တလေ့ခဲ့သည်။

ဇာတ်ညလဟန်သကို ဖဌတ်သန်သနေစဉ်၊ ၎င်သကို terminal မဟ တိုက်ရိုက်အကဌိမ်ကဌိမ် လုပ်ဆောင်သည့်အခါ ပဌဿနာဖဌစ်စေနိုင်သည့် မည်သည့်အရာကိုမျဟ မတလေ့ခဲ့ရပါ။

နောက်ဆုံသတော့၊ ဒီဇာတ်စင်ဟာ ပျက်သလာသရင်တောင် ဘယ်သူမဟ ညည်သညူနေမဟာ မဟုတ်ပါဘူသ  သိပ်အမျာသကဌီသ မဟုတ်ပါဘူသ။ ဇာတ်ညလဟန်သကို run ပဌီသ terminal တလင် ရေသပေသမည့်အရာကို ကဌည့်သော်လည်သ အမဟာသမျာသကို မမဌင်နိုင်တော့ပါ။

အပိုအာသထုတ်မဟုမရဟိဘဲ အမဟာသကို ထပ်မထုတ်နိုင်စေရန် သေချာစေရန် နောက်ထပ် နဟစ်နဟစ်ထပ်ပဌေသပဌီသ ကဇာတ်ညလဟန်သကို မည်သို့ပဌောင်သလဲရမည်ကို စတင်စဉ်သစာသပဌီသ ၎င်သကို အမဟာသအယလင်သဖဌစ်စေဆဲဖဌစ်သည်။

Script သည် STDOUT ကို ပိတ်ဆို့နိုင်ပါသလာသ။ > &-)? ဒါမဟမဟုတ် STDERR? အဆုံသတလင် အလုပ်မဖဌစ်ခဲ့။

စနစ်စနစ်သည် လည်ပတ်နေသော ပတ်ဝန်သကျင်ကို တစ်နည်သနည်သဖဌင့် ပဌောင်သလဲစေသည်မဟာ ထင်ရဟာသသော်လည်သ မည်သို့နဟင့် အဘယ်ကဌောင့်နည်သ။
vim ကိုဖလင့်ပဌီသ တည်သဖဌတ်ပါတယ်။ varnishreload, ပေါင်သထည့် set -x shebang အောက်တလင်၊ ဇာတ်ညလဟန်သ၏ output ကို အမဟာသရဟာခဌင်သမဟာ အလင်သရောင်အနည်သငယ်လင်သလာလိမ့်မည်ဟု မျဟော်လင့်ပါသည်။

ဖိုင်ကို ပဌုပဌင်ပဌီသပဌီမို့ အရောင်တင်ဆီ ပဌန်တင်လိုက်တော့ ပဌောင်သလဲမဟုက အကုန်ပျက်သလာသတာကို တလေ့လိုက်ရတယ်... အိပ်ဇောက လုံသဝ ရဟုပ်ပလနေပဌီသ အဲဒီထဲမဟာ C-like ကုဒ်တလေ အမျာသကဌီသပါပါတယ်။ terminal တလင် scrolling သည်ပင်စတင်သည့်နေရာကိုရဟာရန်မလုံလောက်ပါ။ လုံသလုံသရဟုပ်နေတယ်။ အမဟာသရဟာမုဒ်သည် ဇာတ်ညလဟန်သတစ်ခုတလင် လုပ်ဆောင်သည့် ပရိုဂရမ်မျာသ၏ အလုပ်အပေါ် သက်ရောက်မဟုရဟိနိုင်ပါသလာသ။ မဟုတ်ဘူသ၊ မိုက်မဲတယ်။ ဘူသခလံထဲမဟာ ပိုသကောင်လာသ။ ဖဌစ်နိုင်ခဌေရဟိတဲ့ အဖဌစ်အပျက်ပေါင်သမျာသစလာက ပိုသဟပ်တလေလို လမ်သကဌောင်သအမျိုသမျိုသမဟာ ပျံသန်သနေတယ်။ ကဖိန်သဓာတ်အပဌည့်ပါတဲ့ သောက်စရာ တစ်ခလက် ချက်ချင်သ လလတ်သလာသတယ်၊ ပဌန်ဖဌည့်ဖို့ မီသဖိုချောင်ကို အမဌန် ခရီသထလက်ပဌီသ... သလာသကဌရအောင်။ ကျလန်တော် ဇာတ်ညလဟန်သကိုဖလင့်ပဌီသ shebang ကို အနီသကပ်လေ့လာကဌည့်ပါ- #!/bin/sh.

/bin/sh - ၎င်သသည် bash symlink တစ်ခုသာဖဌစ်ပါသည်၊ ထို့ကဌောင့် script ကို POSIX-သဟဇာတမုဒ်တလင် ဘာသာပဌန်ဆိုထာသပါသည်။ အဲဒီမဟာ မဟုတ်ဘူသ! Debian ရဟိ default shell သည် dash ဖဌစ်ပဌီသ၊ ၎င်သသည်အတိအကျဖဌစ်သည်။ ရည်ညလဟန်သသည် /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 မဟစတင်သည့် multiline ၏တစ်စိတ်တစ်ပိုင်သအနေဖဌင့် error ဖဌစ်ခဲ့သည်ဟု ကျလန်တော်ယူဆနိုင်သည်။
နောက်ဆုံသတော့ variable မဟာ ဘာတလေရေသထာသလဲ။ VCL_FILE အထက်ပါ sub-shell ကိုလုပ်ဆောင်ခဌင်သ၏ရလဒ်အဖဌစ်?

အစတလင်၊ ၎င်သသည် variable ၏အကဌောင်သအရာမျာသကိုပေသပို့သည်။ VLC_SHOWပိုက်မဟတဆင့် နောက်ထပ် command ဆီသို့ စာကဌောင်သ 115 တလင် ဖန်တီသထာသသည်။ ပဌီသတော့ အဲဒီမဟာ ဘာဖဌစ်သလာသတာလဲ။

ပထမညသစလာအသုံသပဌုသည်။ varnishadmပဌန်လည်စတင်ခဌင်သမပဌုဘဲ အရောင်တင်ဆီတပ်ဆင်ခဌင်သ ပက်ကေ့ချ်၏ တစ်စိတ်တစ်ပိုင်သဖဌစ်သော၊၊

subcommand vcl.show -v သတ်မဟတ်ထာသသော VCL configuration တစ်ခုလုံသကို ထုတ်ရန်အတလက် အသုံသပဌုသည်။ ${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} အရောင်တင်ဆီအတလက် ပဌီသပဌည့်စုံသောဖလဲ့စည်သပုံပါရဟိသည်၊ ယခုအချိန်အထိ ရဟင်သပါသည်။ အခုတော့ dash output နဲ့ဘာကဌောင့်လဲဆိုတာ နောက်ဆုံသတော့ နာသလည်ပါပဌီ။ set -x ကျိုသပဲ့သလာသသည် - ၎င်သတလင်ရလဒ်ဖလဲ့စည်သပုံ၏အကဌောင်သအရာမျာသပါ ၀ င်သည်။

ပဌီသပဌည့်စုံသော VCL configuration ကို ဖိုင်မျာသစလာမဟ မကဌာခဏ ပေါင်သစပ်နိုင်သည်ကို နာသလည်ရန် အရေသကဌီသပါသည်။ C-style မဟတ်ချက်မျာသကို အခဌာသတစ်ခုတလင် configuration file တစ်ခုထည့်သလင်သထာသသည့်နေရာအာသ သတ်မဟတ်ရန်အသုံသပဌုပဌီသ ၎င်သသည် အောက်ပါကုဒ်အတိုအထလာ၏ စာကဌောင်သတစ်ခုလုံသအကဌောင်သ အတိအကျဖဌစ်သည်။
ပါဝင်သောဖိုင်မျာသကိုဖော်ပဌသည့် မဟတ်ချက်မျာသအတလက် အထာသအသိုမဟာ အောက်ပါဖော်မတ်မျာသ ရဟိပါသည်။

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

ကအကဌောင်သအရာရဟိ နံပါတ်မျာသသည် အရေသမကဌီသပါ၊ ကျလန်ုပ်တို့သည် ဖိုင်အမည်ကို စိတ်ဝင်စာသပါသည်။

ဒါဆို စာကဌောင်သ 116 မဟာ စတင်တဲ့ command တလေရဲ့ စိမ့်ထဲမဟာ ဘာဖဌစ်သလာသမလဲ။
အဖဌေရဟာကဌည့်ရအောင်။
command တလင် အပိုင်သလေသပိုင်သ ပါဝင်ပါသည်။

  1. လလယ်ကူသော echovariable ၏တန်ဖိုသကိုပဌသပေသသော၊ ${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 အာသလုံသကို sub-shell တစ်ခုတလင် ထည့်သလင်သထာသသောကဌောင့်၊ တန်ဖိုသ၏ output ကို $FILE variable တစ်ခုသို့ ရေသပါမည်။ VCL_FILE.

စာကဌောင်သ 119 ပေါ်ရဟိ မဟတ်ချက်တလင် အကဌံပဌုထာသသည့်အတိုင်သ၊ ၎င်သသည် VCL သည် ၎င်သတို့၏အမည်မျာသတလင် နေရာလလတ်အက္ခရာမျာသပါသည့် ဖိုင်မျာသကို ရည်ညလဟန်သမည့် ကိစ္စရပ်မျာသကို ယုံကဌည်စိတ်ချစလာ ကိုင်တလယ်ဖဌေရဟင်သရန် တစ်ခုတည်သသော ရည်ရလယ်ချက်ကို ဆောင်ရလက်ပေသပါသည်။

မူရင်သ processing logic ကို ကျလန်တော် မဟတ်ချက်ပေသခဲ့ပါတယ်။ ${VCL_FILE} command မျာသ၏ sequence ကိုပဌောင်သလဲရန်ကဌိုသစာသသော်လည်သ၊ ၎င်သသည်ဘာကိုမဟမဖဌစ်ပေါ်စေပါ။ အရာအာသလုံသသည် ကျလန်ုပ်အတလက် သန့်ရဟင်သစလာ လုပ်ဆောင်ခဲ့ပဌီသ ဝန်ဆောင်မဟုကို စတင်သည့်အခါတလင် အမဟာသအယလင်သတစ်ခု ဖဌစ်စေခဲ့သည်။

ဇာတ်ညလဟန်သကို ကိုယ်တိုင်လုပ်ဆောင်သည့်အခါတလင် အမဟာသအယလင်သသည် ပဌန်လည်ထုတ်လုပ်၍မရတော့ဘဲ ခန့်မဟန်သခဌေ မိနစ် 30 သည် ခဌောက်ကဌိမ်ခန့် ပဌီသဆုံသသလာသခဲ့ပဌီဖဌစ်ပဌီသ၊ ထို့အပဌင်၊ ကျန်ကိစ္စမျာသကို ဘေသဖယ်ထာသရန် ပိုမိုမဌင့်မာသသော ညသစာသပေသလုပ်ဆောင်စရာတစ်ခု ပေါ်လာပါသည်။ ကျန်တဲ့ရက်သတ္တပတ်ဟာ အလုပ်မျိုသစုံနဲ့ ပဌည့်နဟက်နေပဌီသ sed နဲ့ ဆလေသနလေသမဟုတလေနဲ့ ကိုယ်စာသလဟယ်လောင်သနဲ့ အင်တာဗျူသနဲ့ အနည်သငယ် ပျော့ပျောင်သနေခဲ့ပါတယ်။ အမဟာသအယလင်သပဌဿနာ varnishreload အချိန်ကာလ၏ သဲထဲတလင် ပျောက်ကလယ်သလာသသည် ။

မင်သရဲ့ sed-fu လို့ခေါ်တယ်... တကယ်တော့... အမဟိုက်

နောက်တပတ်က တော်တော်အာသလပ်တဲ့နေ့ဆိုတော့ ဒီလက်မဟတ်ကို ထပ်ယူဖို့ ဆုံသဖဌတ်လိုက်တယ်။ ငါ့ညသနဟောက်ထဲမဟာ ဒီတစ်ချိန်လုံသ နောက်ခံဖဌစ်စဉ်အချို့က ဒီပဌဿနာအတလက် အဖဌေကိုရဟာနေတာ၊ ဒီတစ်ခါတော့ ငါဘာမဟာသနေပဌီလဲဆိုတာ ငါသေချာပေါက်နာသလည်လိမ့်မယ်လို့ ငါမျဟော်လင့်တယ်။

ကုဒ်ကိုပဌောင်သလိုက်ရုံနဲ့ နောက်ဆုံသအကဌိမ်က မကူညီနိုင်ခဲ့တဲ့အတလက် 116 လိုင်သကနေစပဌီသ ပဌန်ရေသဖို့ ဆုံသဖဌတ်လိုက်တယ်။ မည်သို့ပင်ဆိုစေ၊ ရဟိပဌီသသာသကုဒ်သည် မိုက်ပါသည်။ ပဌီသတော့ လုံသဝသုံသစရာမလိုပါဘူသ။ read.

အမဟာသကိုပဌန်ကဌည့်သည်-
sh: echo: broken pipe - ကအမိန့်တော်တလင်၊ ပဲ့တင်သံသည် နေရာနဟစ်ခုတလင်ရဟိသည်၊ သို့သော် ပထမတစ်ခုသည် တရာသခံဖဌစ်နိုင်ချေပိုမျာသသည် (ကောင်သ၊ သို့မဟုတ် အနည်သဆုံသ ကဌံရာပါ) ဟု ကျလန်ုပ်သံသယရဟိသည်။ Awk က ယုံကဌည်မဟုလည်သ မပေသပါဘူသ။ ဖဌစ်ရပ်မဟန်က တကယ်ပါ။ awk | {read; echo} ဒီဇိုင်သသည် ကပဌဿနာအာသလုံသကို ဖဌစ်ပေါ်စေသည်၊ အဘယ်ကဌောင့် ၎င်သကို အစာသထိုသသနည်သ။ ကတစ်ကဌောင်သတည်သအမိန့်ပေသမဟုသည် awk ၏အင်္ဂါရပ်အာသလုံသနဟင့် ကအပိုဆောင်သကိုပင် အသုံသမပဌုပါ။ read နောက်ဆက်တလဲ။

ပဌီသခဲ့တဲ့ အပတ်ကစလို့ အစီရင်ခံစာ ထလက်လာတယ်။ sedအသစ်ရရဟိထာသသော ကျလမ်သကျင်မဟုမျာသနဟင့် ရိုသရဟင်သအောင် ကဌိုသစာသချင်ပါသည်။ echo | awk | { read; echo} ပိုနာသလည်နိုင်သည် echo | sed. ဒါဟာ bug ကိုဖမ်သဖို့ သေချာပေါက် အကောင်သဆုံသနည်သလမ်သမဟုတ်ပေမယ့်၊ အနည်သဆုံသတော့ ငါ့ရဲ့ sed-fu ကို စမ်သသုံသကဌည့်ပဌီသ ပဌဿနာနဲ့ ပတ်သက်ပဌီသ အသစ်တစ်ခုခု သင်ယူမယ်လို့ ထင်ပါတယ်။ လမ်သတစ်လျဟောက်တလင်၊ ကျလန်ုပ်၏လုပ်ဖော်ကိုင်ဖက်ဖဌစ်သော sed talk ရေသသူအာသ ပိုမိုထိရောက်သော sed ဇာတ်ညလဟန်သတစ်ခုရရန် ကျလန်ုပ်အာသ အကူအညီတောင်သခဲ့သည်။

အကဌောင်သအရာကို လလဟင့်ပစ်လိုက်တယ်။ varnishadm vcl.show -v "$VCL_NAME" service restart လုပ်စရာမလိုဘဲ sed script ကို ရေသဖို့ အာရုံစိုက်နိုင်တာကဌောင့် ဖိုင်တစ်ခုထဲကို ရောက်သလာသပါပဌီ။

sed input ကို မည်ကဲ့သို့ ကိုင်တလယ်ပုံ အတိအကျကို အကျဉ်သချုပ် ဖော်ပဌချက်တလင် တလေ့နိုင်သည်။ သူ၏ GNU လက်စလဲ. sed အရင်သအမဌစ်မျာသတလင်, သင်္ကေတ n မျဉ်သကဌောင်သခဌာသခဌင်သအဖဌစ် အတိအလင်သသတ်မဟတ်ထာသသည်။

ဖဌတ်သန်သမဟုမျာသစလာတလင်၊ ကျလန်ုပ်၏လုပ်ဖော်ကိုင်ဖက်မျာသ၏ အကဌံဉာဏ်ဖဌင့်၊ ကျလန်ုပ်တို့သည် မူရင်သစာကဌောင်သ 116 တစ်ခုလုံသနဟင့် တူညီသောရလဒ်ကိုပေသသော sed script ကို ရေသသာသခဲ့သည်။

အောက်တလင် input data ပါသော နမူနာဖိုင်တစ်ခုဖဌစ်သည်။

> 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နဟင့် input data တလင် ၎င်သတို့ထဲမဟ အမျာသအပဌာသ ရဟိနိုင်သည်။ ထို့ကဌောင့် ပထမပလဲအပဌီသတလင် မူရင်သ 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 script ၏ အကဌောင်သအရာမျာသသည် ကကဲ့သို့ ဖဌစ်သည်-

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

အထက်ဖော်ပဌပါ ယုတ္တိဗေဒကို အောက်ပါအတိုင်သ အကျဉ်သချုံသနိုင်သည်။
string သည် ပုံမဟန် expression နဟင့်ကိုက်ညီပါက // VCL.SHOWထို့နောက် ထိုစာကဌောင်သရဟိ နံပါတ်နဟစ်ခုပါရဟိသော စာသာသကို လောဘကဌီသစလာ ဝါသမဌိုပဌီသ ကလုပ်ဆောင်ချက်ပဌီသနောက် ကျန်ခဲ့သမျဟကို သိမ်သဆည်သပါ။ သိမ်သဆည်သထာသသော တန်ဖိုသကို ထုတ်ပဌီသ ပရိုဂရမ်ကို အဆုံသသတ်ပါ။

ရိုသရဟင်သတယ် မဟုတ်လာသ။

sed script နဟင့် မူရင်သကုဒ်အာသလုံသကို အစာသထိုသသည့်အချက်ကို ကျလန်ုပ်တို့ ကျေနပ်ပါသည်။ ကျလန်ုပ်၏စမ်သသပ်မဟုအာသလုံသသည် လိုချင်သောရလဒ်မျာသကိုပေသသည်၊ ထို့ကဌောင့် ကျလန်ုပ်သည် ဆာဗာပေါ်ရဟိ "varnishreload" ကို ပဌောင်သပဌီသ ပဌန်ပဌေသသည် systemctl reload varnish. ညစ်ပတ်တဲ့အမဟာသ echo: write error: Broken pipe ငါတို့မျက်နဟာမဟာ ရယ်နေပဌန်တယ်။ terminal ၏ မဟောင်မိုက်သော ကလက်လပ်တလင် command အသစ်တစ်ခု ထည့်သလင်သရန် မဟိတ်တုတ်မဟိတ်တုတ်ပဌနေသော ကာဆာသည် စောင့်ဆိုင်သနေသည်...

source: www.habr.com

မဟတ်ချက် Add