የባሽ ስክሪፕቶችን ማረም በሳር ክምር ውስጥ መርፌን እንደመፈለግ ነው፣ በተለይ አዳዲስ ተጨማሪዎች አሁን ባለው ኮድ ቤዝ ውስጥ የመዋቅር፣ የመግቢያ እና የአስተማማኝነት ጉዳዮችን በወቅቱ ሳያስቡ ሲታዩ ነው። በእራስዎ ስህተቶች ወይም ውስብስብ የስክሪፕት ክምርዎችን ሲያቀናብሩ እንደዚህ ባሉ ሁኔታዎች ውስጥ እራስዎን ማግኘት ይችላሉ።
ቡድን
በጽሁፉ ውስጥ, ደራሲው ባለፉት ጥቂት አመታት የተማረውን እና አንዳንድ የተለመዱ ስህተቶችን ያካፍላል. ይህ አስፈላጊ ነው ምክንያቱም እያንዳንዱ የሶፍትዌር ገንቢ በተወሰነ ጊዜ በስራቸው ውስጥ መደበኛ የስራ ተግባሮችን በራስ ሰር ለመስራት ከስክሪፕቶች ጋር ይሰራል።
ወጥመድ ተቆጣጣሪዎች
ያጋጠሙኝ አብዛኞቹ የባሽ ስክሪፕቶች በስክሪፕት አፈጻጸም ወቅት ያልተጠበቀ ነገር ሲከሰት ውጤታማ የማጽዳት ዘዴን ፈጽሞ አይጠቀሙም።
ከዋናው ላይ ምልክት መቀበልን የመሳሰሉ አስገራሚ ነገሮች ከውጭ ሊነሱ ይችላሉ. ስክሪፕቶቹ በአምራች ስርዓቶች ላይ እንዲሰሩ በቂ አስተማማኝ መሆናቸውን ለማረጋገጥ እንደዚህ አይነት ጉዳዮችን ማስተናገድ እጅግ በጣም አስፈላጊ ነው። ለእንደዚህ አይነት ሁኔታዎች ምላሽ ለመስጠት ብዙ ጊዜ የመውጫ ተቆጣጣሪዎችን እጠቀማለሁ፡
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 በእድገት ጊዜ ስህተቶችን ለማግኘት
እንደ አንድ ነገር ማዋሃድ ጠቃሚ ነው
በአገባብ፣ በትርጓሜ እና አንዳንድ ስህተቶች ላይ ሪፖርቶችን ለማግኘት በአካባቢዬ የእድገት አካባቢዎች እጠቀማለሁ በማደግ ላይ እያለ ያመለጡኝ ይሆናል። ይህ ለባሽ ስክሪፕቶችህ የማይንቀሳቀስ መመርመሪያ መሳሪያ ነው እና እንድትጠቀምበት በጣም እመክራለሁ።
የራስዎን የመውጫ ኮድ በመጠቀም
በ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"
ይህ ማመቻቸት በሚያስፈልጋቸው ስክሪፕቶች ውስጥ ችግር/ቀርፋፋ ቦታዎችን እንድለይ ይረዳኛል።
መልካም ዕድል!
ሌላ ምን ማንበብ አለበት:
ሂድ እና የጂፒዩ መሸጎጫዎች። በ Mail.ru Cloud Solutions የS3 ነገር ማከማቻ ውስጥ በድር መንጠቆዎች ላይ የተመሰረተ ክስተት-ተኮር መተግበሪያ ምሳሌ። የቴሌግራም ቻናላችን ስለ ዲጂታል ትራንስፎርሜሽን።
ምንጭ: hab.com