Hababka ugu Fiican ee Qorista Bash: Hagaha Degdegga ah ee Qoraallada Bash La isku halleyn karo iyo Waxqabadka

Hababka ugu Fiican ee Qorista Bash: Hagaha Degdegga ah ee Qoraallada Bash La isku halleyn karo iyo Waxqabadka
wallpaper Shell by manapi

Debuxinta qoraallada bashku waxay la mid tahay raadinta irbad ku jirta cawska, gaar ahaan marka wax cusub lagu daro ay ka soo baxaan codebase-ka jira iyada oo aan waqtigeeda la tixgalin arrimaha qaab dhismeedka, gooynta iyo isku halaynta. Waxaad isku arki kartaa xaaladahan oo kale iyadoo ay ugu wacan tahay khaladaadkaaga ama marka aad maamulayso qoraallo adag.

kooxda Mail.ru Cloud Solutions tarjumay maqaal leh talooyin kaa caawin doona inaad qorto, wax ka saarto oo aad si fiican u ilaaliso qoraalladaada. Rumayso ama ha rumaysan, ma jiraan wax garaaca ku qanacsanaanta qorista kood nadiif ah, diyaar u ah isticmaalka bash code oo shaqeeya mar kasta.

Qoraagu waxa uu maqaalka ku soo bandhigay waxyaabihii uu bartay dhawrkii sano ee la soo dhaafay, iyo waliba khaladaadkii caadiga ahaa ee uu isaga ilaalin lahaa. Tani waa muhiim sababtoo ah soo-saare kasta oo software ah, waqti ka mid ah xirfaddooda, wuxuu la shaqeeyaa qoraallo si ay u habeeyaan hawlaha caadiga ah ee shaqada.

Dabin-qabayaasha

Inta badan qoraalada bash ee aan la kulmay weligood ma isticmaalaan hab nadiifin wax ku ool ah marka wax lama filaan ahi ay dhacaan inta lagu jiro fulinta qoraalka.

Layaab ayaa ka soo bixi kara dibadda, sida helitaanka calaamad ka timid xudunta. Xakamaynta kiisaskan oo kale aad ayay muhiim u tahay si loo hubiyo in qoraaladu yihiin kuwo la isku halayn karo oo ku filan si ay ugu shaqeeyaan nidaamyada wax soo saarka. Waxaan badiyaa adeegsadaa maamulayaasha bixista si aan uga jawaabo xaaladaha sidan oo kale ah:

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 waa amar qolof ku dhex dhisan oo kaa caawinaysa inaad diwaangeliso hawsha nadiifinta ee loo yeedho haddii wax calaamado ahi yimaadaan. Si kastaba ha ahaatee, waa in taxadar gaar ah lala yeesho gacan-qablayaasha sida SIGINT, kaas oo sababa in qoraalka la iska rido.

Intaa waxaa dheer, inta badan kiisaska waa inaad kaliya qabataa EXIT, laakiin fikradda ayaa ah in aad si dhab ah u habeyn karto hab-dhaqanka qoraalka calaamad kasta oo gaar ah.

Ku-dhismay hawlaha go'an - si degdeg ah joojinta qaladka

Aad bay muhiim u tahay in laga jawaabo khaladaadka isla marka ay dhacaan oo si dhakhso ah loo joojiyo fulinta. Ma jiraan wax ka xun sii wadista amarka sidan oo kale ah:

rm -rf ${directory_name}/*

Fadlan ogow in doorsoomuhu directory_name aan la go'aamin.

Waa muhiim in la isticmaalo hawlaha ku dhex jira si loo maareeyo xaaladahan oo kale set, sida set -o errexit, set -o pipefail ama set -o nounset bilowga qoraalka. Hawlahani waxay xaqiijinayaan in qoraalkaagu ka bixi doono isla marka uu la kulmo kood ka bixitaan aan eber ahayn, adeegsiga doorsoomayaasha aan la qeexin, amarada aan ansax ahayn ee la dul maro tuubada, iyo wixii la mid ah:

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

Fiiro gaar ah: hawlaha la dhisay sida set -o errexit, ayaa ka bixi doona qoraalka isla marka uu jiro koodka soo celinta "ceeriin" (oo aan eber ahayn). Sidaa darteed way fiicantahay in la soo bandhigo khaladaadka caadada ah, tusaale ahaan:

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

Qorista qoraallada habkan waxay kugu qasbaysaa inaad aad uga taxaddarto hab-dhaqanka dhammaan amarrada ku jira qoraalka oo aad odoroso suurtagalnimada khalad ka hor intaysan kugu qaadan yaab.

ShellCheck si loo ogaado khaladaadka inta lagu jiro horumarka

Waxaa haboon in la isku daro wax la mid ah ShellCheck galay horumarinta iyo tijaabinta tuubooyinka si aad u hubiso koodka bash ka dhanka ah hababka ugu fiican.

Waxaan u isticmaalaa deegaankayga horumarinta deegaanka si aan u helo warbixino ku saabsan syntax, semantics, iyo khaladaadka qaar ee koodhka oo laga yaabo in aan seegay markii aan horumarinayay. Kani waa qalab falanqaynta joogtada ah ee qoraallada bash-kaaga waxaanan aad ugu talinayaa in la isticmaalo.

Isticmaalka furahaaga bixista

Koodhadhka soo celinta ee POSIX maaha kaliya eber ama hal, laakiin eber ama qiimo aan eber ahayn. Isticmaal sifooyinkan si aad u soo celiso koodka khaladka caadada ah (inta u dhaxaysa 201-254) kiisaska khaladka kala duwan.

Macluumaadkan waxaa markaa isticmaali kara qoraallo kale kuwaas oo ku duubaya kaaga si aad u fahamto sida saxda ah nooca khaladku dhacay ugana falceliyo si waafaqsan:

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

Fiiro gaar ah: fadlan si gaar ah uga digtoonow magacyada doorsoomayaasha aad qeexdo si aad uga fogaato in si lama filaan ah doorsoomayaal deegaan u dhaafaan.

Hawlaha gaynta

Goynta quruxda badan iyo habaysan ayaa muhiim ah in si fudud loo fahmo natiijooyinka qoraalkaaga. Sida luqadaha kale ee barnaamijka heerka sare ah, waxaan had iyo jeer ku isticmaalaa hawlaha goynta asalka ah ee qoraalladayda bash, sida __msg_info, __msg_error iyo wixii la mid ah.

Tani waxay gacan ka geysataa bixinta qaab-dhismeed goynta caadiga ah iyadoo isbedel ku samaynaysa hal meel oo keliya:

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

Caadi ahaan waxaan isku dayaa in aan haysto nooc ka mid ah farsamada qoraalladayda __init, halkaas oo doorsoomayaasha logger-ka ah iyo doorsoomayaasha kale ee nidaamka la bilaabay ama lagu dhejiyay qiimaha caadiga ah. Doorsoomayaashan waxa kale oo laga dejin karaa xulashooyinka khadka taliska inta lagu jiro baaqa qoraalka.

Tusaale ahaan, wax sida:

$ ./run-script.sh --debug

Marka qoraalkan oo kale la fuliyo, waxay hubisaa in goobaha nidaamka-ballaaran loo dejiyo qiyamka caadiga ah haddii loo baahdo, ama ugu yaraan loo bilaabo wax ku habboon haddii loo baahdo.

Caadi ahaan waxaan ku saleeyaa doorashada waxa la bilaabayo iyo waxa aan la samaynayn ee u dhexeeya is-dhexgalka isticmaalaha iyo faahfaahinta qaabeynta ee isticmaaluhu / waa inuu dhex galo.

Dhismaha dib-u-isticmaalka iyo nidaamka nadiifka ah

Koodhka modular/dib loo isticmaali karo

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

Waxaan hayaa kayd gooni ah oo aan isticmaali karo si aan u bilaabo mashruuc/qoraal cusub oo aan rabo in aan horumariyo. Wax kasta oo dib loo isticmaali karo waxaa lagu kaydin karaa meel kayd ah oo ay soo ceshan karaan mashruucyo kale oo raba inay adeegsadaan shaqadaas. Abaabulka mashaariicda habkan waxay si weyn u yaraynaysaa xajmiga qoraallada kale waxayna sidoo kale hubisaa in saldhigga koodhka uu yahay mid yar oo sahlan in la tijaabiyo.

Sida tusaalaha sare ku xusan, dhammaan hawlaha gaynta sida __msg_info, __msg_error iyo kuwa kale, sida warbixinnada Slack, ayaa si gaar ah ugu jira common/* oo si firfircoon ugu xidhmaan xaaladaha kale sida daily_database_operation.sh.

Ka tag nidaam nadiif ah

Haddii aad ku shubayso wax agab ah inta qoraalku socdo, waxaa lagugula talinayaa inaad ku kaydiso dhammaan xogtaas buug la wadaago oo leh magac random, tusaale; /tmp/AlRhYbD97/*. Waxaad isticmaali kartaa soo-saarayaasha qoraalka random si aad u doorato magaca hagaha:

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

Ka dib marka shaqada la dhammeeyo, nadiifinta tusmooyinka noocaan ah waxaa lagu bixin karaa gacan-qabayaasha jillaabyada ee kor looga hadlay. Haddii buug-gacmeedyada ku-meel-gaarka ah aan la daryeelin, way ururaan oo marxaladaha qaarkood waxay keenaan dhibaatooyin lama filaan ah martida loo yahay, sida disk buuxa.

Isticmaalka faylasha qufulka

Badanaa waxaad u baahan tahay inaad hubiso in hal tusaale oo qoraal ah uu ku socdo martigeliyaha wakhti kasta. Tan waxaa lagu samayn karaa iyadoo la isticmaalayo faylal quful.

Caadi ahaan waxaan abuuraa faylal quful /tmp/project_name/*.lock oo hubi inay joogaan bilowga qoraalka. Tani waxay ka caawinaysaa qoraalku inuu si qurux badan u joojiyo oo uu iska ilaaliyo isbeddello lama filaan ah oo ku yimaada nidaamka hab-qoraalka qoraal kale oo barbar socda. Galalka quful looma baahna haddii aad u baahan tahay isla qoraal si loo fuliyo si barbar socda martigeliyaha la siiyay.

Cabbir oo hagaaji

Inta badan waxaan u baahanahay inaan la shaqeyno qoraallada socda waqti dheer, sida hawlgallada xogta maalinlaha ah. Hawlgallada noocan oo kale ah waxay caadi ahaan ku lug leeyihiin taxanaha tillaabooyinka: rarka xogta, hubinta cilladaha, soo dejinta xogta, diritaanka warbixinnada xaaladda, iyo wixii la mid ah.

Xaaladahan oo kale, waxaan had iyo jeer isku dayaa inaan u kala gooyo qoraalka qoraallo yaryar oo kala duwan oo aan ka warbixiyo xaaladdooda iyo waqtiga fulinta anigoo isticmaalaya:

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

Ka dib waxaan arki karaa wakhtiga fulinta:

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

Tani waxay iga caawinaysaa inaan garto dhibka/meelaha gaabis ah ee qoraallada u baahan hagaajin.

nasiib wacan!

Maxaa kale oo la akhriyaa:

  1. Go iyo kaydka GPU.
  2. Tusaalaha arjiga ay wadaan ee ku salaysan webhooks ee kaydinta shayga S3 ee Mail.ru Cloud Solutions.
  3. Kanaalkayaga telegramka ee ku saabsan isbeddelka dhijitaalka ah.

Source: www.habr.com

Add a comment