I-Bash Scripting Best Practicing: Umhlahlandlela osheshayo we-Bash Scripts Ethembekile Nesebenza

I-Bash Scripting Best Practicing: Umhlahlandlela osheshayo we-Bash Scripts Ethembekile Nesebenza
Shell wallpaper by manapi

Ukulungisa ama-bash scripts kufana nokufuna inaliti ku-haystack, ikakhulukazi uma izengezo ezintsha zivela ku-codebase ekhona ngaphandle kokucatshangelwa ngesikhathi kwezindaba zesakhiwo, ukugawulwa kwemithi nokuthembeka. Ungazithola usezimweni ezinjalo ngenxa yamaphutha akho noma lapho uphatha izinqwaba eziyinkimbinkimbi zemibhalo.

Ithimba I-Mail.ru Cloud Solutions uhumushe i-athikili enezincomo ezizokusiza ukuthi ubhale, ulungise futhi ulondoloze imibhalo yakho kangcono. Uyakholwa noma ungakholwa, akukho okudlula ukwaneliseka kokubhala ikhodi ye-bash ehlanzekile, elungele ukusetshenziswa esebenza ngaso sonke isikhathi.

Esihlokweni, umbhali wabelana ngalokho akufundile eminyakeni embalwa edlule, kanye namaphutha ajwayelekile ambambe engalindele. Lokhu kubalulekile ngoba wonke umthuthukisi we-software, esikhathini esithile emsebenzini wakhe, usebenza nemibhalo ukuze enze imisebenzi evamile yomsebenzi.

Abaphathi bezicupho

Iningi lemibhalo ye-bash engihlangabezane nayo ayilokothi isebenzise indlela yokuhlanza esebenzayo lapho kwenzeka okuthile okungalindelekile phakathi nokukhishwa kombhalo.

Izimanga zingavela ngaphandle, njengokwamukela isignali kusuka kumgogodla. Ukuphatha amacala anjalo kubaluleke kakhulu ukuze kuqinisekiswe ukuthi imibhalo ithembekile ngokwanele ukuthi ingasebenza ezinhlelweni zokukhiqiza. Ngivame ukusebenzisa izibambi zokuphuma ukuze ngiphendule kuzimo ezinjengalezi:

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 igobolondo elakhelwe ngaphakathi umyalo okusiza ukuthi ubhalise umsebenzi wokuhlanza obizwa uma kwenzeka kuba namasiginali. Nokho, ukunakekelwa okukhethekile kufanele kuthathwe nabaphathi ezifana SIGINT, okubangela ukuthi iskripthi siyeke.

Ngaphezu kwalokho, ezimweni eziningi kufanele ubambe kuphela EXIT, kodwa umqondo wukuthi ungakwazi ngempela ukwenza ngendlela oyifisayo ukuziphatha kweskripthi kusignali ngayinye.

Imisebenzi esethi eyakhelwe ngaphakathi - ukunqanyulwa ngokushesha ngephutha

Kubaluleke kakhulu ukuphendula amaphutha ngokushesha nje lapho engenzeka futhi uyeke ukwenza ngokushesha. Akukho okungaba kubi njengokuqhubeka nokusebenzisa umyalo kanje:

rm -rf ${directory_name}/*

Sicela uqaphele ukuthi okuguquguqukayo directory_name akunqunyiwe.

Kubalulekile ukusebenzisa imisebenzi eyakhelwe ngaphakathi ukuphatha izimo ezinjalo setnjenge set -o errexit, set -o pipefail noma set -o nounset ekuqaleni kweskripthi. Le misebenzi iqinisekisa ukuthi iskripthi sakho sizophuma lapho nje sihlangabezana nekhodi yokuphuma engeyona iqanda, ukusetshenziswa kwezinto eziguquguqukayo ezingachazwanga, imiyalo engavumelekile edluliswe phezu kwepayipi, nokunye:

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

Qaphela: imisebenzi eyakhelwe ngaphakathi njenge set -o errexit, izophuma kusikripthi ngokushesha nje lapho kukhona ikhodi yokubuyisela "eluhlaza" (ngaphandle kukaziro). Ngakho-ke kungcono ukwethula ukuphatha iphutha langokwezifiso, isibonelo:

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

Ukubhala izikripthi ngale ndlela kukuphoqa ukuthi uqaphele kakhulu mayelana nokuziphatha kwayo yonke imiyalo embhalweni futhi ulindele ukuthi kungenzeka kube nephutha ngaphambi kokuthi umangale.

I-ShellCheck ukuze ithole amaphutha phakathi nokuthuthukiswa

Kuyafaneleka ukuhlanganisa into enjalo I-ShellCheck ekuthuthukisweni kwakho nasekuhloleni amapayipi ukuze uhlole ikhodi yakho ye-bash ngokumelene nemikhuba ehamba phambili.

Ngiyisebenzisa ezindaweni zami zokuthuthukiswa kwendawo ukuze ngithole imibiko ye-syntax, semantics, namaphutha athile kukhodi okungenzeka ukuthi ngiwageje ngenkathi ngithuthukisa. Leli ithuluzi lokuhlaziya elimile lemibhalo yakho ye-bash futhi ngincoma kakhulu ukulisebenzisa.

Ukusebenzisa amakhodi akho okuphuma

Amakhodi okubuyisela ku-POSIX awawona nje uziro noma owodwa, kodwa uyiziro noma inani elingelona uziro. Sebenzisa lezi zici ukubuyisela amakhodi amaphutha ngokwezifiso (phakathi kuka-201-254) ngamaphutha ahlukahlukene.

Lolu lwazi lungasetshenziswa ezinye izikripthi ezigoqa eyakho ukuze uqonde kahle ukuthi hlobo luni lwephutha elenzeke futhi sisabele ngokufanele:

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

Qaphela: sicela uqaphele ngokukhethekile amagama aguquguqukayo owachazayo ukuze ugweme ukweqa okuguquguqukayo kwendawo ngephutha.

Imisebenzi yokugawula

Ukuloga okuhle nokuhlelekile kubalulekile ukuze uqonde kalula imiphumela yeskripthi sakho. Njengezinye izilimi zokuhlela ezisezingeni eliphezulu, ngihlala ngisebenzisa imisebenzi yokugawula yendabuko emibhalweni yami ye-bash, njenge __msg_info, __msg_error nokunye.

Lokhu kusiza ukuhlinzeka ngesakhiwo sokugawulwa esimisiwe ngokwenza izinguquko endaweni eyodwa kuphela:

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

Ngokuvamile ngizama ukuba nohlobo oluthile lomshini emibhalweni yami __init, lapho okuguquguqukayo kwelogi nokunye okuguquguqukayo kwesistimu kuqaliswa noma kusethelwa amanani amisiwe. Lokhu okuguquguqukayo kungase futhi kusethwe kusukela kuzinketho zomugqa womyalo phakathi nokubiza iskripthi.

Isibonelo, into efana nale:

$ ./run-script.sh --debug

Uma iskripthi esinjalo senziwa, siqinisekisa ukuthi izilungiselelo zesistimu yonke zisethelwa kumanani azenzakalelayo uma edingeka, noma okungenani aqaliswe kokuthile okufanele uma kudingeka.

Ngivame ukusekela ukukhetha kokuthi yini engizoyiqala nokungamelwe ngiyenze ekuhwebeni phakathi kokusetshenziswa kubonwa kanye nemininingwane yokucushwa umsebenzisi angakwazi/afanele ukukuhlolisisa.

Izakhiwo zokuphinda zisetshenziswe futhi zihlanze isimo sesistimu

Ikhodi ye-modular/esebenziseka kabusha

β”œβ”€β”€ framework
β”‚   β”œβ”€β”€ common
β”‚   β”‚   β”œβ”€β”€ loggers.sh
β”‚   β”‚   β”œβ”€β”€ mail_reports.sh
β”‚   β”‚   └── slack_reports.sh
β”‚   └── daily_database_operation.sh

Ngigcina inqolobane ehlukile engingayisebenzisa ukuqalisa iskripthi esisha sephrojekthi/bash engifuna ukusithuthukisa. Noma yini engasetshenziswa kabusha ingagcinwa endaweni yokugcina futhi ilandwe amanye amaphrojekthi afuna ukusebenzisa lokho kusebenza. Ukuhlela amaphrojekthi ngale ndlela kunciphisa kakhulu ubukhulu bezinye izikripthi futhi kuqinisekisa ukuthi isisekelo sekhodi sincane futhi kulula ukusihlola.

Njengesibonelo esingenhla, yonke imisebenzi yokugawula njenge __msg_info, __msg_error nezinye, njengemibiko ye-Slack, ziqukethwe ngokwehlukana ku common/* futhi uxhumeke ngamandla kwezinye izimo ezifana daily_database_operation.sh.

Shiya ngemuva kwesistimu ehlanzekile

Uma ulayisha noma yiziphi izinsiza ngenkathi iskripthi sisebenza, kuyanconywa ukuthi ugcine yonke idatha enjalo kuhla lwemibhalo olwabiwe olunegama elingahleliwe, isb. /tmp/AlRhYbD97/*. Ungasebenzisa ama-generator ombhalo angahleliwe ukuze ukhethe igama lomkhombandlela:

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

Ngemva kokuphothulwa komsebenzi, ukuhlanzwa kwemibhalo enjalo kunganikezwa kubaphathi behhuku okukhulunywe ngabo ngenhla. Uma uhla lwemibhalo lwesikhashana lunganakekelwa, luyanqwabelana futhi kwesinye isikhathi lubangele izinkinga ezingalindelekile kumsingathi, njengediski egcwele.

Ukusebenzisa amafayela wokukhiya

Ngokuvamile udinga ukuqinisekisa ukuthi isenzakalo esisodwa kuphela seskripthi esisebenza kumsingathi nganoma yisiphi isikhathi. Lokhu kungenziwa ngokusebenzisa amafayela wokukhiya.

Ngivamise ukudala amafayela wokukhiya phakathi /tmp/project_name/*.lock futhi uhlole ukuthi zikhona yini ekuqaleni kombhalo. Lokhu kusiza umbhalo ukuthi unqamule kahle futhi ugweme izinguquko ezingalindelekile kusimo sesistimu ngesinye iskripthi esisebenza ngokuhambisana. Amafayela okukhiya awadingeki uma udinga umbhalo ofanayo ukuze usetshenziswe ngokuhambisana kumsingathi esinikeziwe.

Linganisa futhi uthuthukise

Ngokuvamile kudingeka sisebenze ngemibhalo esebenza isikhathi eside, njengokusebenza kwansuku zonke kusizindalwazi. Imisebenzi enjalo ngokuvamile ihilela ukulandelana kwezinyathelo: ukulayisha idatha, ukuhlola okudidayo, ukungenisa idatha, ukuthumela imibiko yesimo, nokunye.

Ezimweni ezinjalo, ngihlala ngizama ukwephula iskripthi sibe izikripthi ezincane ezihlukene futhi ngibike isimo sazo nesikhathi sokwenza ngisebenzisa:

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

Kamuva ngingabona isikhathi sokwenza nge:

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

Lokhu kungisiza ukuthi ngikhombe izindawo eziyinkinga/ezihamba kancane kumaskripthi adinga ukuthuthukiswa.

Good luck!

Okunye ongakufunda:

  1. Hamba kanye nezinqolobane ze-GPU.
  2. Isibonelo sohlelo lokusebenza oluqhutshwa umcimbi olususelwe kuma-webhooks kusitoreji sento ye-S3 se-Mail.ru Cloud Solutions.
  3. Isiteshi sethu socingo mayelana noguquko lwedijithali.

Source: www.habr.com

Engeza amazwana