Dea-Chleachtais Scriptithe Bash: Treoir Thapa ar Scripteanna Bash Iontaofa agus Feidhmíochta

Dea-Chleachtais Scriptithe Bash: Treoir Thapa ar Scripteanna Bash Iontaofa agus Feidhmíochta
Shell ballapháipéir ag manapi

Tá sé cosúil le scripteanna dífhabhtaithe bash a bheith ag lorg snáthaid i stoc féir, go háirithe nuair a bhíonn breisithe nua le feiceáil sa bhunachar cód atá ann cheana féin gan breithniú tráthúil a dhéanamh ar shaincheisteanna struchtúir, logála agus iontaofachta. Is féidir leat tú féin a aimsiú i gcásanna den sórt sin mar gheall ar do bhotúin féin nó agus tú ag bainistiú carnanna casta scripteanna.

Foireann Mail.ru Cloud Solutions d’aistrigh alt le moltaí a chabhróidh leat do chuid scripteanna a scríobh, a dhífhabhtú agus a choinneáil níos fearr. Creid é nó ná creid, ní shásaíonn aon ní an cód bash atá réidh le húsáid a scríobh a oibríonn gach uair.

San alt, roinneann an t-údar a bhfuil foghlamtha aige le blianta beaga anuas, chomh maith le roinnt botúin choitianta a d'fhág go raibh sé ina gharda. Tá sé seo tábhachtach mar go n-oibríonn gach forbróir bogearraí, ag pointe éigin ina ngairm bheatha, le scripteanna chun gnáththascanna oibre a uathoibriú.

Láimhseálaithe gaiste

Ní úsáideann formhór na scripteanna bash ar tháinig mé trasna orthu meicníocht éifeachtach glanta riamh nuair a tharlaíonn rud gan choinne le linn fhorghníomhú na scripte.

Is féidir iontas a bheith ann ón taobh amuigh, mar shampla comhartha a fháil ón gcroílár. Tá sé thar a bheith tábhachtach cásanna den sórt sin a láimhseáil lena chinntiú go bhfuil na scripteanna iontaofa go leor le feidhmiú ar chórais táirgthe. Is minic a bhainim úsáid as láimhseálaithe éalaithe chun freagairt do chásanna mar seo:

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 is blaosc ordaithe ionsuite a chuidíonn leat feidhm ghlantacháin a chlárú ar a dtugtar i gcás aon chomharthaí. Mar sin féin, ba chóir cúram speisialta a ghlacadh le láimhseálaithe mar SIGINT, rud is cúis le ginmhilleadh an script.

Ina theannta sin, i bhformhór na gcásanna níor chóir duit ach a ghabháil EXIT, ach is é an smaoineamh gur féidir leat iompar an script a shaincheapadh i ndáiríre do gach comhartha aonair.

Feidhmeanna socraithe ionsuite - foirceannadh tapa ar earráid

Tá sé an-tábhachtach freagra a thabhairt ar earráidí a luaithe a tharlaíonn siad agus stop a chur i gcrích go tapa. Ní fhéadfadh aon rud a bheith níos measa ná leanúint ar aghaidh ag rith ordú mar seo:

rm -rf ${directory_name}/*

Tabhair faoi deara go bhfuil an athróg directory_name gan a chinneadh.

Tá sé tábhachtach feidhmeanna ionsuite a úsáid chun cásanna den sórt sin a láimhseáil set, mar set -o errexit, set -o pipefailset -o nounset ag tús na scripte. Cinntíonn na feidhmeanna seo go scoirfidh do script chomh luath agus a thagann sé trasna ar aon chód scoir neamh-nialas, úsáid athróg neamhshainithe, orduithe neamhbhailí a chuirtear thar phíb, agus mar sin de:

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

Tabhair faoi deara: feidhmeanna ionsuite mar set -o errexit, scoirfidh sé an script chomh luath agus a bheidh cód tuairisceáin "amh" (seachas nialas). Mar sin is fearr láimhseáil earráide saincheaptha a thabhairt isteach, mar shampla:

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

Má scríobhann tú scripteanna ar an mbealach seo ní mór duit a bheith níos cúramaí maidir le hiompar na n-orduithe go léir sa script agus réamh-mheas a bheith agat ar an bhféidearthacht go mbeidh earráid ann sula dtógfaidh sé iontas ort.

ShellCheck chun earráidí a bhrath le linn forbartha

Is fiú rud éigin mar a chomhtháthú Shell Seiceáil isteach i do phíblínte forbartha agus tástála chun do chód bash a sheiceáil i gcoinne na gcleachtas is fearr.

Úsáidim é i mo thimpeallachtaí forbartha áitiúla chun tuairiscí a fháil ar chomhréir, ar shéimeantaic, agus ar roinnt earráidí sa chód a d'fhéadfadh a bheith caillte agam agus mé ag forbairt. Is uirlis anailíse statach é seo do do scripteanna bash agus molaim go mór é a úsáid.

Ag baint úsáide as do chóid scoir féin

Ní hamháin náid nó a haon atá sna cóid tuairisceáin in POSIX, ach náid nó luach neamh-nialas. Bain úsáid as na gnéithe seo chun cóid earráide saincheaptha a thabhairt ar ais (idir 201-254) le haghaidh cásanna éagsúla earráide.

Is féidir an fhaisnéis seo a úsáid ansin ag scripteanna eile a fhillteann do chuid féin chun a thuiscint go díreach cén cineál earráide a tharla agus freagairt dá réir:

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

Tabhair faoi deara: Bí cúramach le do thoil leis na hainmneacha athróg a shainíonn tú chun athróga timpeallachta a sháraíonn de thaisme a sheachaint.

Feidhmeanna logáil

Tá logáil álainn agus struchtúrtha tábhachtach chun torthaí do scripte a thuiscint go héasca. Cosúil le teangacha ríomhchlárúcháin ardleibhéil eile, bainim úsáid i gcónaí as feidhmeanna logála dúchais i mo scripteanna bash, mar shampla __msg_info, __msg_error agus mar sin de.

Cuidíonn sé seo le struchtúr logála caighdeánaithe a sholáthar trí athruithe a dhéanamh in aon áit amháin:

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

De ghnáth déanaim iarracht meicníocht de chineál éigin a bheith i mo scripteanna __init, i gcás ina ndéantar athróga logálaí den sórt sin agus athróga córais eile a thúsú nó a shocrú de réir luachanna réamhshocraithe. Is féidir na hathróga seo a shocrú freisin ó roghanna na n-orduithe le linn agairt scripte.

Mar shampla, rud éigin cosúil le:

$ ./run-script.sh --debug

Nuair a fhorghníomhaítear a leithéid de script, cinntíonn sé go socraítear socruithe ar fud an chórais de réir luachanna réamhshocraithe má tá siad ag teastáil, nó ar a laghad tosaithe chuig rud éigin oiriúnach más gá.

Is iondúil go mbunaim an rogha maidir le cad ba cheart a thosú agus cad nach ceart a dhéanamh ar chomhbhabhtáil idir an comhéadan úsáideora agus sonraí na bhfoirmíochtaí ar féidir leis an úsáideoir/ar cheart don úsáideoir dul i ngleic leo.

Ailtireacht le haghaidh athúsáide agus staid an chórais ghlan

Cód modúlach/ath-inúsáidte

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

Coimeádaim stór ar leith ar féidir liom a úsáid chun script tionscadail/bash nua a thosú a theastaíonn uaim a fhorbairt. Is féidir aon rud is féidir a athúsáid a stóráil i stór agus é a aisghabháil ag tionscadail eile atá ag iarraidh an fheidhmiúlacht sin a úsáid. Trí thionscadail a eagrú ar an mbealach seo laghdaítear go mór méid scripteanna eile agus cinntíonn sé freisin go bhfuil an bonn cód beag agus éasca le tástáil.

Mar atá sa sampla thuas, tá gach feidhm logáil ar nós __msg_info, __msg_error agus tá cinn eile, mar thuarascálacha Slack, cuimsithe go leithleach i common/* agus nascadh go dinimiciúil i gcásanna eile mar daily_database_operation.sh.

Fág córas glan taobh thiar de

Má tá acmhainní ar bith á luchtú agat agus an script á rith, moltar na sonraí sin go léir a stóráil in eolaire comhroinnte le hainm randamach, m.sh. /tmp/AlRhYbD97/*. Is féidir leat gineadóirí téacs randamacha a úsáid chun an t-ainm eolaire a roghnú:

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

Tar éis an obair a bheith críochnaithe, is féidir glanadh na n-eolairí sin a sholáthar sna láimhseálaithe duán a pléadh thuas. Mura dtugtar aire do eolairí sealadacha, carnann siad agus ag am éigin cuireann siad fadhbanna gan choinne ar an óstach, mar dhiosca iomlán.

Ag baint úsáide as comhaid ghlais

Go minic ní mór duit a chinntiú nach bhfuil ach cás amháin de script ar siúl ar óstach ag aon am ar leith. Is féidir é seo a dhéanamh ag baint úsáide as comhaid ghlais.

De ghnáth cruthaím comhaid ghlais isteach /tmp/project_name/*.lock agus seiceáil an bhfuil siad i láthair ag tús na scripte. Cuidíonn sé seo leis an script deireadh a chur go grásta agus athruithe gan choinne ar staid an chórais a sheachaint trí script eile a rith ag an am céanna. Níl gá le comhaid ghlais más gá duit an script chéanna a fhorghníomhú go comhthreomhar ar óstach ar leith.

Tomhais agus feabhas

Is minic go gcaithfimid oibriú le scripteanna a ritheann thar thréimhsí fada ama, mar oibríochtaí bunachar sonraí laethúla. Is gnách go mbíonn seicheamh céimeanna i gceist le hoibríochtaí den sórt sin: sonraí a luchtú, aimhrialtachtaí a sheiceáil, sonraí a allmhairiú, tuarascálacha stádais a sheoladh, agus mar sin de.

I gcásanna den sórt sin, déanaim iarracht i gcónaí an script a bhriseadh ina scripteanna beaga ar leith agus a stádas agus a n-am forghníomhaithe a thuairisciú ag baint úsáide as:

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

Níos déanaí is féidir liom an t-am forghníomhaithe a fheiceáil le:

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

Cuidíonn sé seo liom réimsí faidhbe/mall a aithint i scripteanna a dteastaíonn barrfheabhsú uathu.

Ádh mór oraibh!

Cad eile atá le léamh:

  1. Téigh agus GPU caches.
  2. Sampla d’fheidhmchlár atá bunaithe ar imeacht atá bunaithe ar bhróga gréasáin i stóráil réad S3 Mail.ru Cloud Solutions.
  3. Ár gcainéal teileagram faoi chlaochlú digiteach.

Foinse: will.com

Add a comment