Bash Scripting အကောင်သဆုံသအလေ့အကျင့်မျာသ- ယုံကဌည်စိတ်ချရသောနဟင့် စလမ်သဆောင်ရည် Bash Scripts မျာသအတလက် အမဌန်လမ်သညလဟန်

Bash Scripting အကောင်သဆုံသအလေ့အကျင့်မျာသ- ယုံကဌည်စိတ်ချရသောနဟင့် စလမ်သဆောင်ရည် Bash Scripts မျာသအတလက် အမဌန်လမ်သညလဟန်
manapi မဟ Shell နောက်ခံပုံ

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

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

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

ထောင်ချောက် ကိုင်တလယ်သူမျာသ

ကျလန်တော်ကဌုံတလေ့ဖူသသော bash script အမျာသစုသည် script execute လုပ်နေစဉ်အတလင်သ မမျဟော်လင့်ထာသသော အရာတစ်ခုဖဌစ်ပေါ်လာသောအခါ ထိရောက်သော ရဟင်သလင်သရေသယန္တရာသကို မသုံသပါ။

အူတိုင်မဟ အချက်ပဌမဟုကို လက်ခံခဌင်သကဲ့သို့သော ပဌင်ပမဟ အံ့အာသသင့်မဟုမျာသ ဖဌစ်ပေါ်လာနိုင်သည်။ ဇာတ်ညလဟန်သမျာသသည် ထုတ်လုပ်ရေသစနစ်မျာသပေါ်တလင် လုပ်ဆောင်ရန် လုံလောက်သော ယုံကဌည်စိတ်ချရကဌောင်သ သေချာစေရန် အဆိုပါကိစ္စမျာသကို ကိုင်တလယ်ရန် အလလန်အရေသကဌီသပါသည်။ ကကဲ့သို့သော အခဌေအနေမျာသကို တုံ့ပဌန်ရန်အတလက် ထလက်ပေါက်လက်ကိုင်မျာသကို ကျလန်ုပ်မကဌာခဏအသုံသပဌုသည်-

function handle_exit() {
  // Add cleanup code here
  // for eg. rm -f "/tmp/${lock_file}.lock"
  // exit with an appropriate status code
}
  
// trap <HANDLER_FXN> <LIST OF SIGNALS TO TRAP>
trap handle_exit 0 SIGHUP SIGINT SIGQUIT SIGABRT SIGTERM

trap အချက်ပဌမဟုမျာသရဟိပါက ခေါ်သည့် ရဟင်သလင်သရေသလုပ်ဆောင်ချက်ကို မဟတ်ပုံတင်ရန် ကူညီပေသသည့် shell built-in command တစ်ခုဖဌစ်သည်။ သို့သော် ထိုကဲ့သို့သော ကိုင်တလယ်သူမျာသနဟင့် အထူသဂရုစိုက်သင့်သည်။ SIGINTဇာတ်ညလဟန်သပျက်သလာသစေသည်။

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

Built-in set လုပ်ဆောင်ချက်မျာသ - အမဟာသအယလင်သပေါ် အမဌန်ရပ်စဲခဌင်သ။

အမဟာသမျာသ ဖဌစ်ပေါ်လာသည်နဟင့် တပဌိုင်နက် တုံ့ပဌန်ရန်နဟင့် အမဌန်လုပ်ဆောင်ခဌင်သကို ရပ်ရန် အလလန်အရေသကဌီသပါသည်။ ကကဲ့သို့သော command ကိုဆက်လက်လုပ်ဆောင်ခဌင်သထက်ပိုမိုဆိုသရလာသနိုင်သည်-

rm -rf ${directory_name}/*

variable ကို သတိပဌုပါ။ directory_name မသတ်မဟတ်။

ထိုသို့သောအခဌေအနေမျာသကိုကိုင်တလယ်ရန် built-in လုပ်ဆောင်ချက်မျာသကိုအသုံသပဌုရန်အရေသကဌီသပါသည်။ setထိုသို့သောအဖဌစ် set -o errexit, set -o pipefail သို့မဟုတ် set -o nounset ဇာတ်ညလဟန်သရဲ့အစမဟာ။ သင်၏ script သည် သုညမဟုတ်သော ထလက်ပေါက်ကုဒ်၊ သတ်မဟတ်မထာသသော ကိန်သရဟင်မျာသကို အသုံသပဌုမဟု၊ ပိုက်တစ်ခုမဟ ဖဌတ်သလာသသော မမဟန်ကန်သော ညလဟန်ကဌာသချက်မျာသနဟင့် အခဌာသအရာမျာသနဟင့် ကဌုံတလေ့သည်နဟင့် တပဌိုင်နက် ကလုပ်ဆောင်ချက်မျာသသည် ထလက်သလာသကဌောင်သ သေချာစေသည်-

#!/usr/bin/env bash

set -o errexit
set -o nounset
set -o pipefail

function print_var() {
  echo "${var_value}"
}

print_var

$ ./sample.sh
./sample.sh: line 8: var_value: unbound variable

မဟတ်ချက်: Built-in အစရဟိတဲ့ Function တလေပါ။ set -o errexit"အကဌမ်သ" ပဌန်ပေသကုဒ် (သုညမဟုတ်သော အခဌာသ) "အကဌမ်သ" ရဟိနေသည်နဟင့် တပဌိုင်နက်၊ ဇာတ်ညလဟန်သမဟ ထလက်ပါမည်။ ထို့ကဌောင့် စိတ်ကဌိုက် အမဟာသအယလင်သ ကိုင်တလယ်ခဌင်သကို မိတ်ဆက်ရန် ပိုကောင်သသည်၊ ဥပမာ၊

#!/bin/bash
error_exit() {
  line=$1
  shift 1
  echo "ERROR: non zero return code from line: $line -- $@"
  exit 1
}
a=0
let a++ || error_exit "$LINENO" "let operation returned non 0 code"
echo "you will never see me"
# run it, now we have useful debugging output
$ bash foo.sh
ERROR: non zero return code from line: 9 -- let operation returned non 0 code

ကနည်သဖဌင့် scripts မျာသရေသသာသခဌင်သသည် သင့်အာသ script အတလင်သရဟိ command မျာသအာသလုံသ၏ အပဌုအမူနဟင့် ပတ်သက်၍ ပိုမိုသတိထာသရန်နဟင့် ၎င်သသည် သင့်အာသ မအံ့သဌမီတလင် အမဟာသအယလင်သတစ်ခု ဖဌစ်နိုင်ခဌေကို ကဌိုတင်ခန့်မဟန်သရန် တလန်သအာသပေသပါသည်။

ဖလံ့ဖဌိုသတိုသတက်မဟုအတလင်သ အမဟာသအယလင်သမျာသကို ရဟာဖလေရန် ShellCheck

ပေါင်သစည်သရကျိုသနပ်ပါတယ်။ ရဟဲ သင်၏ bash ကုဒ်ကို အကောင်သဆုံသ အလေ့အကျင့်မျာသနဟင့် ဆန့်ကျင်၍ စစ်ဆေသရန် သင်၏ ဖလံ့ဖဌိုသတိုသတက်မဟုနဟင့် စမ်သသပ်မဟု ပိုက်လိုင်သမျာသတလင်

တီထလင်နေစဉ်အတလင်သ လလဲချော်သလာသနိုင်သည့် ကုဒ်ရဟိ အထာသအသို၊ အဓိပ္ပာယ်နဟင့် အချို့သော အမဟာသအယလင်သမျာသကို ရယူရန် ကျလန်ုပ်၏ ဒေသဆိုင်ရာ ဖလံ့ဖဌိုသတိုသတက်မဟု ပတ်ဝန်သကျင်မျာသတလင် ၎င်သကို အသုံသပဌုပါသည်။ ၎င်သသည် သင်၏ bash scripts မျာသအတလက် static analysis tool တစ်ခုဖဌစ်ပဌီသ ၎င်သကိုအသုံသပဌုရန် အထူသအကဌံပဌုလိုပါသည်။

သင့်ကိုယ်ပိုင် ထလက်ပေါက်ကုဒ်မျာသကို အသုံသပဌုခဌင်သ။

POSIX ရဟိ ပဌန်ပေသကုဒ်မျာသသည် သုည သို့မဟုတ် တစ်ခုမျဟသာမဟုတ်ဘဲ သုည သို့မဟုတ် သုညမဟုတ်သော တန်ဖိုသတစ်ခုဖဌစ်သည်။ အမျိုသမျိုသသောအမဟာသအယလင်သကိစ္စမျာသအတလက် စိတ်ကဌိုက်အမဟာသကုဒ်မျာသ (201-254 အကဌာသ) ကို ပဌန်ပေသရန် ကအင်္ဂါရပ်မျာသကို အသုံသပဌုပါ။

အမဟာသအယလင်သ အမျိုသအစာသကို အတိအကျ သိရဟိနာသလည်ပဌီသ လျော်ညီစလာ တုံ့ပဌန်ရန် သင့်အာသ ခဌုံငုံထာသသည့် အခဌာသ script မျာသမဟ ကအချက်အလက်ကို အသုံသပဌုနိုင်ပါသည်။

#!/usr/bin/env bash

SUCCESS=0
FILE_NOT_FOUND=240
DOWNLOAD_FAILED=241

function read_file() {
  if ${file_not_found}; then
    return ${FILE_NOT_FOUND}
  fi
}

မဟတ်ချက်: ပတ်ဝန်သကျင် ကိန်သရဟင်မျာသကို မတော်တဆ လလဟမ်သမိုသခဌင်သမဟ ရဟောင်ရဟာသရန် သင်သတ်မဟတ်ထာသသော ကိန်သရဟင်အမည်မျာသကို အထူသသတိထာသပါ။

မဟတ်တမ်သလုပ်ဆောင်ချက်မျာသ

သင့် script ၏ရလဒ်မျာသကို လလယ်ကူစလာ နာသလည်နိုင်ရန် လဟပပဌီသ စနစ်တကျ မဟတ်တမ်သသလင်သခဌင်သသည် အရေသကဌီသပါသည်။ အခဌာသအဆင့်မဌင့်ပရိုဂရမ်သမင်သဘာသာစကာသမျာသကဲ့သို့ပင်၊ ကျလန်ုပ်သည် ကျလန်ုပ်၏ bash script မျာသကဲ့သို့သော မူရင်သ logging functions မျာသကို အမဌဲသုံသပါသည်။ __msg_info, __msg_error ဒါပေါ်မဟာ။

၎င်သသည် တစ်နေရာတည်သတလင် ပဌောင်သလဲမဟုမျာသပဌုလုပ်ခဌင်သဖဌင့် စံချိန်စံညလဟန်သသတ်မဟတ်ထာသသော သစ်ခုတ်ခဌင်သဖလဲ့စည်သပုံကို ပံ့ပိုသပေသသည်-

#!/usr/bin/env bash

function __msg_error() {
    [[ "${ERROR}" == "1" ]] && echo -e "[ERROR]: $*"
}

function __msg_debug() {
    [[ "${DEBUG}" == "1" ]] && echo -e "[DEBUG]: $*"
}

function __msg_info() {
    [[ "${INFO}" == "1" ]] && echo -e "[INFO]: $*"
}

__msg_error "File could not be found. Cannot proceed"

__msg_debug "Starting script execution with 276MB of available RAM"

ကျလန်ုပ်သည် ကျလန်ုပ်၏ ဇာတ်ညလဟန်သမျာသတလင် ယန္တရာသတစ်မျိုသမျိုသရဟိရန် ကဌိုသစာသလေ့ရဟိပါသည်။ __initထိုသို့သော logger variable မျာသနဟင့် အခဌာသသော system variable မျာသကို အစပျိုသခဌင်သ သို့မဟုတ် ပုံသေတန်ဖိုသမျာသအဖဌစ် သတ်မဟတ်ထာသသည့်နေရာတလင်၊ script invocation လုပ်နေစဉ်တလင် အဆိုပါ variable မျာသကို command line ရလေသချယ်မဟုမျာသမဟ သတ်မဟတ်နိုင်သည်။

ဥပမာအာသဖဌင့်၊

$ ./run-script.sh --debug

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

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

ပဌန်လည်အသုံသပဌုရန်နဟင့် သန့်ရဟင်သမဟုစနစ်အတလက် ဗိသုကာပညာ

မော်ဂျူလာ/ပဌန်သုံသနိုင်သော ကုဒ်

├── framework
│   ├── common
│   │   ├── loggers.sh
│   │   ├── mail_reports.sh
│   │   └── slack_reports.sh
│   └── daily_database_operation.sh

ကျလန်ုပ်တီထလင်လိုသော ပရောဂျက်/ bash script အသစ်ကို အစပဌုရန် အသုံသပဌုနိုင်သည့် သီသခဌာသ repository တစ်ခုကို သိမ်သဆည်သထာသသည်။ ပဌန်လည်အသုံသပဌုနိုင်သည့် မည်သည့်အရာကိုမဆို repository တလင် သိမ်သဆည်သနိုင်ပဌီသ ထိုလုပ်ဆောင်ချက်ကို အသုံသပဌုလိုသော အခဌာသပရောဂျက်မျာသမဟ ပဌန်လည်ရယူနိုင်သည်။ ကနည်သဖဌင့် ပရောဂျက်မျာသကို စုစည်သခဌင်သသည် အခဌာသသော script မျာသ၏ အရလယ်အစာသကို သိသာထင်ရဟာသစလာ လျဟော့ချပေသပဌီသ ကုဒ်အခဌေခံသည် သေသငယ်ပဌီသ စမ်သသပ်ရန် လလယ်ကူကဌောင်သလည်သ သေချာစေသည်။

အထက်ဖော်ပဌပါဥပမာတလင်ကဲ့သို့၊ ကဲ့သို့သော loggging functions မျာသအာသလုံသ __msg_info, __msg_error နဟင့် Slack အစီရင်ခံစာမျာသကဲ့သို့သော အခဌာသအရာမျာသကို သီသခဌာသစီပါရဟိသည်။ common/* နဟင့် ကဲ့သို့သော အခဌာသအခဌေအနေမျာသတလင် ဒိုင်သနမစ်ဖဌင့် ချိတ်ဆက်ပါ။ daily_database_operation.sh.

သန့်ရဟင်သတဲ့စနစ် ချန်ထာသခဲ့ပါ။

အကယ်၍ သင်သည် ဇာတ်ညလဟန်သကို လုပ်ဆောင်နေချိန်တလင် မည်သည့်အရင်သအမဌစ်မျာသကိုမဆို ဒေါင်သလုဒ်လုပ်နေပါက၊ ၎င်သဒေတာအာသလုံသကို ကျပန်သအမည်ဖဌင့် မျဟဝေထာသသော လမ်သညလဟန်တလင် သိမ်သဆည်သရန် အကဌံပဌုပါသည်။ /tmp/AlRhYbD97/*. လမ်သညလဟန်အမည်ကို ရလေသချယ်ရန် ကျပန်သစာသာသ ဂျင်နရေတာမျာသကို သင်အသုံသပဌုနိုင်သည်-

rand_dir_name="$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 1)"

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

လော့ခ်ဖိုင်မျာသကို အသုံသပဌုခဌင်သ။

မကဌာခဏဆိုသလို script တစ်ခု၏ဥပမာတစ်ခုသာ host တစ်ခုပေါ်တလင်အလုပ်လုပ်နေကဌောင်သသေချာစေရန်မကဌာခဏလိုအပ်သည်။ လော့ခ်ဖိုင်မျာသကို အသုံသပဌု၍ ၎င်သကို လုပ်ဆောင်နိုင်သည်။

သော့ခတ်ထာသတဲ့ ဖိုင်တလေကို ကျလန်တော် ဖန်တီသလေ့ရဟိပါတယ်။ /tmp/project_name/*.lock ဇာတ်ညလဟန်သ၏အစတလင် ၎င်သတို့၏ရဟိနေခဌင်သရဟိမရဟိ စစ်ဆေသပါ။ ၎င်သသည် ဇာတ်ညလဟန်သကို ချောမလေ့စလာ အဆုံသသတ်စေပဌီသ အပဌိုင်လုပ်ဆောင်နေသည့် အခဌာသသော script ဖဌင့် စနစ်အခဌေအနေသို့ မမျဟော်လင့်ထာသသော အပဌောင်သအလဲမျာသကို ရဟောင်ရဟာသရန် ကူညီပေသသည်။ ပေသထာသသော host တစ်ခုပေါ်တလင် တူညီသော script ကို အပဌိုင်လုပ်ဆောင်ရန် လိုအပ်ပါက လော့ခ်ဖိုင်မျာသကို မလိုအပ်ပါ။

တိုင်သတာပဌီသ တိုသတက်အောင်လုပ်ပါ။

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

ထိုသို့သောအခဌေအနေမျိုသတလင်၊ ကျလန်ုပ်သည် ဇာတ်ညလဟန်သကို သီသခဌာသအသေသစာသ script မျာသအဖဌစ် ခလဲခဌမ်သပဌီသ ၎င်သတို့၏ အခဌေအနေနဟင့် လုပ်ဆောင်ချိန်ကို အသုံသပဌု၍ အစီရင်ခံရန် အမဌဲကဌိုသစာသသည်-

time source "${filepath}" "${args}">> "${LOG_DIR}/RUN_LOG" 2>&1

နောက်ပိုင်သတလင် ကလပ်မျက်သည့်အချိန်ကို မဌင်နိုင်သည်-

tac "${LOG_DIR}/RUN_LOG.txt" | grep -m1 "real"

၎င်သသည် ပိုမိုကောင်သမလန်အောင်ပဌုလုပ်ရန် လိုအပ်သော scripts မျာသရဟိ ပဌဿနာ/နဟေသကလေသသောနေရာမျာသကို ဖော်ထုတ်ရန် ကျလန်ုပ်အာသ ကူညီပေသပါသည်။

ကံကောင်သပါစေ!

နောက်ထပ်ဖတ်စရာမျာသ

  1. သလာသပဌီသ GPU ကက်ရဟ်။
  2. Mail.ru Cloud Solutions ၏ S3 အရာဝတ္ထုသိုလဟောင်မဟုတလင် webhooks မျာသကိုအခဌေခံထာသသော ဖဌစ်ရပ်မဟမောင်သနဟင်သည့်အက်ပ်တစ်ခု၏ဥပမာ။
  3. ဒစ်ဂျစ်တယ်အသလင်ပဌောင်သခဌင်သအကဌောင်သ ကျလန်ုပ်တို့၏ကဌေသနန်သလိုင်သ။

source: www.habr.com

မဟတ်ချက် Add