የባሽ ስክሪፕት ምርጥ ልምዶች፡ ፈጣን መመሪያ ለአስተማማኝ እና ለአፈጻጸም ባሽ ስክሪፕቶች

የባሽ ስክሪፕት ምርጥ ልምዶች፡ ፈጣን መመሪያ ለአስተማማኝ እና ለአፈጻጸም ባሽ ስክሪፕቶች
የሼል ልጣፍ በማናፒ

የባሽ ስክሪፕቶችን ማረም በሳር ክምር ውስጥ መርፌን እንደመፈለግ ነው፣ በተለይ አዳዲስ ተጨማሪዎች አሁን ባለው ኮድ ቤዝ ውስጥ የመዋቅር፣ የመግቢያ እና የአስተማማኝነት ጉዳዮችን በወቅቱ ሳያስቡ ሲታዩ ነው። በእራስዎ ስህተቶች ወይም ውስብስብ የስክሪፕት ክምርዎችን ሲያቀናብሩ እንደዚህ ባሉ ሁኔታዎች ውስጥ እራስዎን ማግኘት ይችላሉ።

ቡድን Mail.ru የደመና መፍትሄዎች ስክሪፕቶችህን በተሻለ ሁኔታ ለመጻፍ፣ ለማረም እና ለማቆየት የሚረዱህን ምክሮች የያዘ ጽሑፍ ተርጉሟል። ብታምኑም ባታምኑም በማንኛውም ጊዜ የሚሰራ ንፁህና ለአገልግሎት ዝግጁ የሆነ የባሽ ኮድ በመጻፍ የሚያገኘውን እርካታ የሚያሸንፈው የለም።

በጽሁፉ ውስጥ, ደራሲው ባለፉት ጥቂት አመታት የተማረውን እና አንዳንድ የተለመዱ ስህተቶችን ያካፍላል. ይህ አስፈላጊ ነው ምክንያቱም እያንዳንዱ የሶፍትዌር ገንቢ በተወሰነ ጊዜ በስራቸው ውስጥ መደበኛ የስራ ተግባሮችን በራስ ሰር ለመስራት ከስክሪፕቶች ጋር ይሰራል።

ወጥመድ ተቆጣጣሪዎች

ያጋጠሙኝ አብዛኞቹ የባሽ ስክሪፕቶች በስክሪፕት አፈጻጸም ወቅት ያልተጠበቀ ነገር ሲከሰት ውጤታማ የማጽዳት ዘዴን ፈጽሞ አይጠቀሙም።

ከዋናው ላይ ምልክት መቀበልን የመሳሰሉ አስገራሚ ነገሮች ከውጭ ሊነሱ ይችላሉ. ስክሪፕቶቹ በአምራች ስርዓቶች ላይ እንዲሰሩ በቂ አስተማማኝ መሆናቸውን ለማረጋገጥ እንደዚህ አይነት ጉዳዮችን ማስተናገድ እጅግ በጣም አስፈላጊ ነው። ለእንደዚህ አይነት ሁኔታዎች ምላሽ ለመስጠት ብዙ ጊዜ የመውጫ ተቆጣጣሪዎችን እጠቀማለሁ፡

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 የሼል አብሮ የተሰራ ትእዛዝ ነው በማናቸውም ምልክቶች ጊዜ የሚጠራውን የማጽዳት ተግባር ለመመዝገብ የሚያግዝ። ይሁን እንጂ እንደ ተቆጣጣሪዎች ልዩ ጥንቃቄ መደረግ አለበት SIGINT, ይህም ስክሪፕቱ እንዲቋረጥ ያደርገዋል.

በተጨማሪም, በአብዛኛዎቹ ሁኔታዎች ብቻ መያዝ አለብዎት EXITነገር ግን ሃሳቡ ለእያንዳንዱ ግለሰብ ምልክት የስክሪፕቱን ባህሪ በትክክል ማበጀት ይችላሉ.

አብሮ የተሰራ ስብስብ ተግባራት - በስህተት ላይ ፈጣን መቋረጥ

ስህተቶች እንደተከሰቱ ወዲያውኑ ምላሽ መስጠት እና አፈፃፀምን በፍጥነት ማቆም በጣም አስፈላጊ ነው. እንደዚህ አይነት ትዕዛዝ ማስኬዱን ከመቀጠል የከፋ ነገር የለም፡-

rm -rf ${directory_name}/*

እባክዎን ተለዋዋጭ መሆኑን ያስተውሉ directory_name አልተወሰነም።

እንደዚህ ያሉ ሁኔታዎችን ለመቆጣጠር አብሮ የተሰሩ ተግባራትን መጠቀም አስፈላጊ ነው setእንደ set -o errexit, set -o pipefail ወይም set -o nounset በስክሪፕቱ መጀመሪያ ላይ. እነዚህ ተግባራት የእርስዎ ስክሪፕት ልክ ዜሮ ያልሆነ የመውጫ ኮድ፣ ያልተገለጹ ተለዋዋጮች አጠቃቀም፣ ልክ ያልሆኑ በፓይፕ ላይ የተላለፉ ትዕዛዞችን እና የመሳሰሉትን ሲያጋጥመው እንደሚወጣ ያረጋግጣሉ፡

#!/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

ማስታወሻ: እንደ አብሮ የተሰሩ ተግባራት 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

ስክሪፕቶችን በዚህ መንገድ መፃፍ በስክሪፕቱ ውስጥ ስላሉት ሁሉም ትዕዛዞች ባህሪ የበለጠ እንዲጠነቀቁ እና በድንገት ከመውሰዱ በፊት ስህተት ሊኖር እንደሚችል እንዲገምቱ ያስገድድዎታል።

ShellCheck በእድገት ጊዜ ስህተቶችን ለማግኘት

እንደ አንድ ነገር ማዋሃድ ጠቃሚ ነው Llልቼክ የባሽ ኮድዎን ከምርጥ ልምዶች ጋር ለመፈተሽ ወደ ልማትዎ እና የቧንቧ መስመሮችን ይሞክሩ።

በአገባብ፣ በትርጓሜ እና አንዳንድ ስህተቶች ላይ ሪፖርቶችን ለማግኘት በአካባቢዬ የእድገት አካባቢዎች እጠቀማለሁ በማደግ ላይ እያለ ያመለጡኝ ይሆናል። ይህ ለባሽ ስክሪፕቶችህ የማይንቀሳቀስ መመርመሪያ መሳሪያ ነው እና እንድትጠቀምበት በጣም እመክራለሁ።

የራስዎን የመውጫ ኮድ በመጠቀም

በPOSIX ውስጥ ያሉ የመመለሻ ኮዶች ዜሮ ወይም አንድ ብቻ ሳይሆኑ ዜሮ ወይም ዜሮ ያልሆኑ እሴት ናቸው። ለተለያዩ የስህተት ጉዳዮች ብጁ የስህተት ኮዶችን (በ201-254 መካከል) ለመመለስ እነዚህን ባህሪያት ተጠቀም።

ይህ መረጃ ምን አይነት ስህተት እንደተከሰተ በትክክል ለመረዳት እና ምላሽ ለመስጠት የርስዎን በሚጠቅሙ ሌሎች ስክሪፕቶች ሊጠቀሙበት ይችላሉ።

#!/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
}

ማስታወሻ: በአጋጣሚ የአካባቢ ተለዋዋጮችን ለማስወገድ በተለይ እርስዎ በገለጹዋቸው ተለዋዋጭ ስሞች ይጠንቀቁ።

የምዝግብ ማስታወሻ ተግባራት

የስክሪፕትህን ውጤት በቀላሉ ለመረዳት ውብ እና የተዋቀረ ምዝግብ ማስታወሻ አስፈላጊ ነው። እንደሌሎች ከፍተኛ ደረጃ የፕሮግራም አወጣጥ ቋንቋዎች፣ ሁልጊዜም እንደ ባሽ ስክሪፕቶች ያሉ ቤተኛ ምዝግብ ተግባራትን እጠቀማለሁ። __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, እንደዚህ ያሉ የሎገር ተለዋዋጮች እና ሌሎች የስርዓት ተለዋዋጮች የተጀመሩበት ወይም ወደ ነባሪ እሴቶች የተቀመጡበት። እነዚህ ተለዋዋጮች በስክሪፕት ጥሪ ወቅት ከትእዛዝ መስመር አማራጮች ሊዘጋጁ ይችላሉ።

ለምሳሌ፣ እንደዚህ ያለ ነገር

$ ./run-script.sh --debug

እንዲህ ዓይነቱ ስክሪፕት ሲተገበር የስርዓተ-ሰፊ ቅንጅቶች አስፈላጊ ከሆነ ወደ ነባሪ እሴቶች መዘጋጀታቸውን ወይም ቢያንስ አስፈላጊ ከሆነ ተገቢ በሆነ ነገር መጀመሩን ያረጋግጣል።

እኔ ብዙውን ጊዜ በተጠቃሚው በይነገጽ እና ተጠቃሚው ሊገባባቸው በሚችላቸው የውቅሮች ዝርዝሮች መካከል በሚደረግ የንግድ ልውውጥ ላይ ምን መጀመር እና ምን ማድረግ እንደሌለበት ምርጫን መሠረት አደርጋለሁ።

ለድጋሚ ጥቅም እና ለንጹህ የስርዓት ሁኔታ አርክቴክቸር

ሞዱል/እንደገና ጥቅም ላይ ሊውል የሚችል ኮድ

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

ማዳበር የምፈልገውን አዲስ ፕሮጀክት/ባሽ ስክሪፕት ለመጀመር የምጠቀምበትን የተለየ ማከማቻ አስቀምጣለሁ። እንደገና ጥቅም ላይ ሊውል የሚችል ማንኛውም ነገር በማከማቻ ማከማቻ ውስጥ ሊከማች እና ያንን ተግባር ለመጠቀም በሚፈልጉ ሌሎች ፕሮጀክቶች ሊሰበሰብ ይችላል። ፕሮጄክቶችን በዚህ መንገድ ማደራጀት የሌሎችን ስክሪፕቶች መጠን በእጅጉ ይቀንሳል እና እንዲሁም የኮድ መሰረቱ ትንሽ እና ለመፈተሽ ቀላል መሆኑን ያረጋግጣል።

ከላይ ባለው ምሳሌ እንደሚታየው ሁሉም የምዝግብ ማስታወሻ ተግባራት እንደ __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)"

ሥራው ከተጠናቀቀ በኋላ እንደነዚህ ያሉትን ማውጫዎች ማጽዳት ከላይ በተገለጹት መንጠቆ ተቆጣጣሪዎች ውስጥ ሊሰጥ ይችላል. ጊዜያዊ ማውጫዎች ካልተንከባከቡ, ይሰበስባሉ እና በተወሰነ ደረጃ በአስተናጋጁ ላይ ያልተጠበቁ ችግሮች ለምሳሌ እንደ ሙሉ ዲስክ.

የመቆለፊያ ፋይሎችን በመጠቀም

ብዙውን ጊዜ የስክሪፕት አንድ ምሳሌ ብቻ በማንኛውም ጊዜ በአስተናጋጅ ላይ እየሰራ መሆኑን ማረጋገጥ አለብዎት። ይህ የመቆለፊያ ፋይሎችን በመጠቀም ሊከናወን ይችላል.

ብዙውን ጊዜ የመቆለፊያ ፋይሎችን እፈጥራለሁ /tmp/project_name/*.lock እና በስክሪፕቱ መጀመሪያ ላይ መገኘታቸውን ያረጋግጡ። ይህ ስክሪፕቱ በሚያምር ሁኔታ እንዲቋረጥ እና በትይዩ በሚሰራ ሌላ ስክሪፕት በስርዓት ሁኔታ ላይ ያልተጠበቁ ለውጦችን ለማስወገድ ይረዳል። በተሰጠ አስተናጋጅ ላይ በትይዩ እንዲፈፀም ተመሳሳይ ስክሪፕት ከፈለጉ የመቆለፊያ ፋይሎች አያስፈልጉም።

ይለኩ እና ያሻሽሉ

ብዙ ጊዜ እንደ ዕለታዊ የውሂብ ጎታ ኦፕሬሽኖች ካሉ ለረጅም ጊዜ ከሚሰሩ ስክሪፕቶች ጋር መስራት አለብን። እንደዚህ አይነት ስራዎች በመደበኛነት የእርምጃዎች ቅደም ተከተል ያካትታሉ: ውሂብን መጫን, ያልተለመዱ ነገሮችን መፈተሽ, መረጃን ማስመጣት, የሁኔታ ሪፖርቶችን መላክ, ወዘተ.

በእንደዚህ ዓይነት ሁኔታዎች ፣ እኔ ሁል ጊዜ ስክሪፕቱን ወደ ተለያዩ ትናንሽ ስክሪፕቶች ለመከፋፈል እሞክራለሁ እና ሁኔታቸውን እና የአፈፃፀም ጊዜያቸውን እንደሚከተለው ሪፖርት ያድርጉ-

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

በኋላ ላይ የማስፈጸሚያ ጊዜውን ማየት እችላለሁ፡-

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

ይህ ማመቻቸት በሚያስፈልጋቸው ስክሪፕቶች ውስጥ ችግር/ቀርፋፋ ቦታዎችን እንድለይ ይረዳኛል።

መልካም ዕድል!

ሌላ ምን ማንበብ አለበት:

  1. ሂድ እና የጂፒዩ መሸጎጫዎች።
  2. በ Mail.ru Cloud Solutions የS3 ነገር ማከማቻ ውስጥ በድር መንጠቆዎች ላይ የተመሰረተ ክስተት-ተኮር መተግበሪያ ምሳሌ።
  3. የቴሌግራም ቻናላችን ስለ ዲጂታል ትራንስፎርሜሽን።

ምንጭ: hab.com

አስተያየት ያክሉ