Mekhoa e Molemo ka ho Fetisisa ea Bash Scripting: Tataiso e Potlakileng ea Lingoliloeng tsa Bash tse Tšepahalang le tsa Ts'ebetso

Mekhoa e Molemo ka ho Fetisisa ea Bash Scripting: Tataiso e Potlakileng ea Lingoliloeng tsa Bash tse Tšepahalang le tsa Ts'ebetso
Shell wallpaper by manapi

Debugging bash scripts ho tšoana le ho batla nale ka har'a furu, haholo-holo ha litlatsetso tse ncha li hlaha ka har'a codebase e teng ntle le ho nahanisisa ka nako ea litaba tsa sebopeho, ho rema lifate le ho tšepahala. U ka iphumana u le maemong a joalo ka lebaka la liphoso tsa hau kapa ha u laola liqubu tse rarahaneng tsa mangolo.

sehlopha Mail.ru Cloud Solutions e fetoletse sengoloa se nang le likhothaletso tse tla u thusa ho ngola, ho lokisa le ho boloka mangolo a hau hamolemo. E lumela kapa che, ha ho letho le fetang khotsofalo ea ho ngola khoutu ea bash e hloekileng, e loketseng ho sebelisoa e sebetsang nako le nako.

Sehloohong sena, mongoli o arolelana seo a ithutileng sona lilemong tse 'maloa tse fetileng, hammoho le liphoso tse ling tse tloaelehileng tse ileng tsa mo tšoara. Sena se bohlokoa hobane moetsi e mong le e mong oa software, ka nako e 'ngoe mosebetsing oa hae, o sebetsa ka lingoliloeng ho iketsetsa mesebetsi e tloaelehileng ea mosebetsi.

Bahlokomeli ba maraba

Lingoliloeng tse ngata tsa bash tseo ke kopaneng le tsona ha li sebelise mokhoa o sebetsang oa ho hloekisa ha ntho e sa lebelloang e etsahala nakong ea ts'ebetso ea script.

Lintho tse makatsang li ka hlaha ka ntle, tse kang ho amohela letšoao ho tloha bohareng. Ho sebetsana le linyeoe tse joalo ho bohlokoa haholo ho netefatsa hore mangolo a ts'epahala ho lekana ho sebetsa lits'ebetsong tsa tlhahiso. Hangata ke sebelisa li-exit handlers ho araba maemo a kang ana:

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 ke khetla e ahiloeng ka taelo e u thusang ho ngolisa mosebetsi oa ho hloekisa o bitsoang haeba ho na le matšoao. Leha ho le joalo, tlhokomelo e khethehileng e lokela ho nkoa ka ba sebetsang joalo ka SIGINT, e etsang hore script e khaotse.

Ho phaella moo, maemong a mangata u lokela ho tšoara feela EXIT, empa mohopolo ke hore o ka khona ho etsa mokhoa oa sengoloa bakeng sa lets'oao le leng le le leng.

Mesebetsi e kentsoeng ka hare - ho felisa ka potlako ka phoso

Ho bohlokoa haholo ho arabela liphoso hang ha li etsahala le ho emisa ho bolaoa kapele. Ha ho letho le ka ba mpe ho feta ho tsoela pele ho tsamaisa taelo e kang ena:

rm -rf ${directory_name}/*

Ka kopo hlokomela hore ho feto-fetoha directory_name e sa ikemisetsa.

Ho bohlokoa ho sebelisa mesebetsi e hahelletsoeng ho sebetsana le maemo a joalo set, joalo ka set -o errexit, set -o pipefail kapa set -o nounset qalong ea mongolo. Mesebetsi ena e netefatsa hore mongolo oa hau o tla tsoa hang ha o kopana le khoutu efe kapa efe ea ho tsoa e seng zero, tšebeliso ea mefuta e sa hlalosoang, litaelo tse fosahetseng tse fetisitsoeng holim'a phala, joalo-joalo:

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

Ela hloko: mesebetsi e hahiloeng joalo ka set -o errexit, e tla tsoa ho script hang ha ho e-na le khoutu ea ho khutlisa "e tala" (ntle le zero). Ka hona, ho molemo ho kenyelletsa mokhoa oa ho sebetsana le liphoso tsa tloaelo, mohlala:

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

Ho ngola mangolo ka tsela ena ho o qobella ho ba hlokolosi haholoanyane mabapi le boitšoaro ba litaelo tsohle tse ngotsoeng le ho lebella monyetla oa phoso pele e ka u makatsa.

ShellCheck ho bona liphoso nakong ea nts'etsopele

Ke habohlokoa ho kopanya ntho e kang Sheba Shell ho nts'etsopele ea hau le liphaephe tsa liteko ho lekola khoutu ea hau ea bash khahlano le mekhoa e metle.

Ke e sebelisa libakeng tsa ka tsa ntlafatso ea lehae ho fumana litlaleho tsa syntax, semantics, le liphoso tse ling tsa khoutu tseo e kanna eaba ke li fositse ha ke ntse ke nts'etsapele. Ena ke sesebelisoa sa tlhahlobo e tsitsitseng bakeng sa mangolo a hau a bash mme ke khothaletsa haholo ho e sebelisa.

Ho sebelisa likhoutu tsa hau tsa ho tsoa

Likhoutu tsa ho khutlisa ho POSIX ha se lefela feela kapa e le 'ngoe, empa ke lefela kapa ke boleng bo seng lefela. Sebelisa likarolo tsena ho khutlisa likhoutu tsa liphoso tsa tloaelo (pakeng tsa 201-254) bakeng sa linyeoe tse fapaneng tsa liphoso.

Lintlha tsena li ka sebelisoa ke lingoloa tse ling tse thatelang tsa hau ho utloisisa hantle hore na ke phoso ea mofuta ofe e etsahetseng le ho etsa joalo:

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

Ela hloko: Ka kopo ela hloko ka ho khetheha mabitso a feto-fetohang ao u a hlalosang ho qoba ho tlola maemo a tikoloho ka phoso.

Mesebetsi ea ho rema lifate

Ho rema lifate tse ntle le tse hlophisitsoeng ho bohlokoa ho utloisisa habonolo litholoana tsa mongolo oa hau. Joalo ka lipuo tse ling tsa maemo a holimo, ke lula ke sebelisa mesebetsi ea ho rema lifate libukeng tsa ka tsa bash, joalo ka __msg_info, __msg_error joalo-joalo.

Sena se thusa ho fana ka sebopeho se tloaelehileng sa ho rema lifate ka ho etsa liphetoho sebakeng se le seng feela:

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

Hangata ke leka ho ba le mofuta o itseng oa mochine mangolong a ka __init, moo mefuta e joalo ea ho rema lifate le mefuta e meng ea tsamaiso e qalisoang kapa e behoa ho boleng ba kamehla. Liphetoho tsena li ka boela tsa behoa ho tloha likhethong tsa mela ea taelo nakong ea kopo ea script.

Ka mohlala, ntho e kang:

$ ./run-script.sh --debug

Ha mongolo o joalo o etsoa, ​​​​o netefatsa hore litlhophiso tsa sistimi ka bophara li behiloe ho boleng ba kamehla haeba li hlokahala, kapa bonyane li qalisoa ho hong ho loketseng ha ho hlokahala.

Hangata ke theha khetho ea seo ke lokelang ho se qala le seo ke sa lokelang ho se etsa khoebong pakeng tsa sebopeho sa mosebedisi le lintlha tsa litlhophiso tseo mosebedisi a ka li hlahlobang.

Mehaho bakeng sa ho sebelisoa hape le ho hloekisa boemo ba tsamaiso

Modular/khoutu e ka sebelisoang hape

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

Ke boloka polokelo e arohaneng eo nka e sebelisang ho qala sengoloa se secha sa projeke / bash seo ke batlang ho se hlahisa. Ntho efe kapa efe e ka sebelisoang hape e ka bolokoa sebakeng sa polokelo mme ea khutlisoa ke merero e meng e batlang ho sebelisa ts'ebetso eo. Ho hlophisa merero ka tsela ena ho fokotsa haholo boholo ba mangolo a mang hape ho tiisa hore motheo oa khoutu o monyenyane ebile o bonolo ho o hlahloba.

Joalo ka mohlala o ka holimo, mesebetsi eohle ea ho rema lifate joalo ka __msg_info, __msg_error 'me tse ling, joalo ka litlaleho tsa Slack, li fumaneha ka thoko common/* le ho hokahana ka matla maemong a mang joalo ka daily_database_operation.sh.

Tlohela ka mor'a tsamaiso e hloekileng

Haeba u ntse u kenya lisebelisoa leha e le life ha script e ntse e sebetsa, ho kgothaletswa ho boloka dintlha tsohle tse joalo bukeng e arolelanoang ka lebitso le sa tloaelehang, mohlala. /tmp/AlRhYbD97/*. U ka sebelisa lijenereithara tsa mongolo ho khetha lebitso la directory:

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

Ka mor'a hore mosebetsi o phethoe, ho hloekisoa ha libuka tse joalo ho ka fanoa ka li-hook handlers tse boletsoeng ka holimo. Haeba li-directory tsa nakoana li sa hlokomeloe, lia bokellana 'me ka nako e itseng li baka mathata a sa lebelloang ho moamoheli, joalo ka disk e felletseng.

Ho sebelisa lifaele tsa senotlolo

Hangata o hloka ho etsa bonnete ba hore ke mohlala o le mong feela oa mongolo o sebetsang ho moamoheli ka nako efe kapa efe. Sena se ka etsoa ka ho sebelisa lifaele tsa senotlolo.

Hangata ke etsa lifaele tsa senotlolo /tmp/project_name/*.lock 'me u hlahlobe boteng ba bona qalong ea script. Sena se thusa mongolo ho emisa ka bokhabane le ho qoba liphetoho tse sa lebelloang ho boemo ba sistimi ka mongolo o mong o tsamaeang ka ho bapa. Lifaele tsa notlela ha li hlokehe haeba u hloka mongolo o ts'oanang hore o phethoe ka ho bapa le moamoheli ea fanoeng.

Lekanya le ho ntlafatsa

Hangata re hloka ho sebetsa ka lingoloa tse nkang nako e telele, joalo ka ts'ebetso ea letsatsi le letsatsi ea database. Ts'ebetso e joalo hangata e kenyelletsa tatellano ea mehato: ho kenya data, ho lekola liphoso, ho tlisa data, ho romella litlaleho tsa boemo, joalo-joalo.

Maemong a joalo, ke lula ke leka ho arola sengoloa ka lingoloa tse nyane ebe ke tlaleha boemo ba tsona le nako ea ts'ebetso ke sebelisa:

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

Hamorao ke khona ho bona nako ea ts'ebetso ka:

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

Sena se nthusa ho tseba libaka tsa bothata/tse liehang ho lingoliloeng tse hlokang ho ntlafatsoa.

Mahlohonolo!

Ke eng hape eo u ka e balang:

  1. Tsamaea le li-cache tsa GPU.
  2. Mohlala oa ts'ebetso e tsamaisoang ke ketsahalo e thehiloeng ho li-webhooks sebakeng sa polokelo ea ntho ea S3 ea Mail.ru Cloud Solutions.
  3. Seteishene sa rona sa thelekramo mabapi le phetoho ea dijithale.

Source: www.habr.com

Eketsa ka tlhaloso