Cleachdaidhean as fheàrr airson sgrìobadh Bash: Iùl sgiobalta air sgriobtaichean Bash earbsach agus Coileanaidh

Cleachdaidhean as fheàrr airson sgrìobadh Bash: Iùl sgiobalta air sgriobtaichean Bash earbsach agus Coileanaidh
Pàipear-balla Shell le manapi

Tha sgriobtaichean debugging bash coltach ri bhith a’ coimhead airson snàthad ann am cruach-fheòir, gu h-àraidh nuair a nochdas cur-ris ùr anns a’ chòd-chòd a th’ ann mar-thà gun beachdachadh ann an deagh àm air cùisean structair, logaidh agus earbsachd. Faodaidh tu thu fhèin a lorg ann an leithid de shuidheachaidhean an dàrna cuid air sgàth do mhearachdan fhèin no nuair a bhios tu a’ stiùireadh pìosan iom-fhillte de sgriobtaichean.

sgioba Mail.ru Cloud Solutions eadar-theangaich artaigil le molaidhean a chuidicheas tu gus na sgriobtaichean agad a sgrìobhadh, a dheasbad agus a chumail nas fheàrr. Creid e no nach creid, chan eil dad a ’toirt buaidh air sàsachd sgrìobhadh còd bash glan, deiseil airson a chleachdadh a bhios ag obair a h-uile uair.

Anns an artaigil, tha an t-ùghdar a 'roinn na tha e air ionnsachadh thairis air na beagan bhliadhnaichean a dh' fhalbh, a bharrachd air cuid de mhearachdan cumanta a chuir às dha. Tha seo cudromach leis gu bheil a h-uile leasaiche bathar-bog, aig àm air choreigin nan cùrsa-beatha, ag obair le sgriobtaichean gus gnìomhan obrach àbhaisteach a dhèanamh fèin-ghluasadach.

Luchd-làimhseachaidh ribe

Cha bhith a’ mhòr-chuid de sgriobtaichean bash ris an do thachair mi a-riamh a’ cleachdadh inneal glanaidh èifeachdach nuair a thachras rudeigin ris nach robh dùil aig àm cur an gnìomh sgriobt.

Faodaidh iongnadh èirigh bhon taobh a-muigh, leithid faighinn comharra bhon chridhe. Tha làimhseachadh chùisean mar seo air leth cudromach gus dèanamh cinnteach gu bheil na sgriobtaichean earbsach gu leòr airson ruith air siostaman toraidh. Bidh mi tric a’ cleachdadh innealan-làimhseachaidh fàgail gus freagairt a thoirt do shuidheachaidhean 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 na àithne slige a-staigh a chuidicheas tu gus gnìomh glanaidh ris an canar a chlàradh gun fhios nach bi comharran ann. Ach, bu chòir cùram sònraichte a ghabhail le luchd-làimhseachaidh leithid SIGINT, a bheir air an sgriobtar sgur.

A bharrachd air an sin, sa mhòr-chuid de chùisean cha bu chòir dhut ach a ghlacadh EXIT, ach is e am beachd gun urrainn dhut giùlan an sgriobt a ghnàthachadh airson gach comharra fa leth.

Gnìomhan suidhichte togte - crìochnachadh luath air mearachd

Tha e glè chudromach freagairt a thoirt do mhearachdan cho luath ‘s a thachras iad agus stad a chuir gu bàs gu sgiobalta. Cha b’ urrainn dad a bhith na bu mhiosa na bhith a’ leantainn air adhart a’ ruith àithne mar seo:

rm -rf ${directory_name}/*

Thoir an aire gu bheil an caochlaideach directory_name neo-chinnteach.

Tha e cudromach gnìomhan togte a chleachdadh gus suidheachaidhean mar sin a làimhseachadh setleithid set -o errexit, set -o pipefail no set -o nounset aig toiseach an sgriobtar. Bidh na gnìomhan seo a’ dèanamh cinnteach gun fhalbh an sgriobt agad cho luath ‘s a choinnicheas e ri còd fàgail neo-neoni, cleachdadh caochladairean neo-mhìnichte, òrdughan neo-dhligheach air an toirt seachad air pìob, agus mar sin air adhart:

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

Note: gnìomhan togte leithid set -o errexit, fàgaidh e an sgriobt cho luath ‘s a tha còd tilleadh“ amh ”(seach neoni). Mar sin tha e nas fheàrr làimhseachadh mhearachdan àbhaisteach a thoirt a-steach, mar eisimpleir:

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

Le bhith a’ sgrìobhadh sgriobtaichean mar seo bidh thu nas faiceallach mu ghiùlan nan òrduighean gu lèir san sgriobt agus a bhith an dùil gum bi mearachd ann mus cuir e iongnadh ort.

ShellCheck gus mearachdan a lorg rè leasachadh

Is fhiach a bhith ag amalachadh rudeigin mar sin ShellCheck a-steach don leasachadh agus na pìoban deuchainn agad gus do chòd bash a sgrùdadh an aghaidh nan cleachdaidhean as fheàrr.

Bidh mi ga chleachdadh anns na h-àrainneachdan leasachaidh ionadail agam gus aithisgean fhaighinn air co-chòrdadh, semantics, agus cuid de mhearachdan sa chòd a dh’ fhaodadh a bhith air chall fhad ‘s a bha mi a’ leasachadh. Is e inneal sgrùdaidh statach a tha seo airson na sgriobtaichean bash agad agus tha mi gu mòr a’ moladh a chleachdadh.

Cleachd na còdan fàgail agad fhèin

Chan eil còdan tilleadh ann am POSIX dìreach neoni no aon, ach neoni no luach neo-neoni. Cleachd na feartan seo gus còdan mearachd gnàthaichte a thilleadh (eadar 201-254) airson diofar chùisean mearachd.

Faodar am fiosrachadh seo a chleachdadh an uairsin le sgriobtaichean eile a bhios gad chuartachadh gus tuigsinn dè dìreach an seòrsa mearachd a thachair agus freagairt a rèir sin:

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

Note: feuch gum bi thu gu sònraichte faiceallach leis na h-ainmean caochlaideach a tha thu a’ mìneachadh gus nach cuir thu cus air caochladairean àrainneachd gun fhiosta.

Feartan logaidh

Tha logadh breagha agus structarail cudromach gus toraidhean do sgriobt a thuigsinn gu furasta. Coltach ri cànanan prògramaidh àrd-ìre eile, bidh mi an-còmhnaidh a’ cleachdadh gnìomhan logaidh dùthchasach anns na sgriobtaichean bash agam, leithid __msg_info, __msg_error agus mar sin air.

Bidh seo a’ cuideachadh le bhith a’ toirt seachad structar logaidh àbhaisteach le bhith a’ dèanamh atharrachaidhean ann an aon àite a-mhà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"

Mar as trice bidh mi a’ feuchainn ri uidheamachd de sheòrsa air choreigin a bhith anns na sgriobtaichean agam __init, far a bheil caochladairean logger mar sin agus caochladairean siostam eile air an tòiseachadh no air an suidheachadh gu luachan bunaiteach. Faodar na caochladairean sin a shuidheachadh cuideachd bho roghainnean loidhne-àithne rè gairm sgriobt.

Mar eisimpleir, rudeigin mar:

$ ./run-script.sh --debug

Nuair a thèid a leithid de sgriobt a chuir gu bàs, nì e cinnteach gu bheil roghainnean air feadh an t-siostaim air an suidheachadh gu luachan bunaiteach ma tha feum orra, no co-dhiù air an tòiseachadh gu rudeigin iomchaidh ma tha sin riatanach.

Mar as trice bidh mi a’ stèidheachadh an roghainn dè a thòisicheas tu agus dè nach bu chòir a dhèanamh air malairt eadar an eadar-aghaidh cleachdaiche agus mion-fhiosrachadh mu na rèiteachaidhean as urrainn / a bu chòir don neach-cleachdaidh sgrùdadh a dhèanamh.

Ailtireachd airson ath-chleachdadh agus staid siostam glan

Còd modular / ath-chleachdadh

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

Bidh mi a’ cumail stòr air leth as urrainn dhomh a chleachdadh gus pròiseact / sgriobt bash ùr a thòiseachadh a tha mi airson a leasachadh. Faodar rud sam bith a ghabhas ath-chleachdadh a stòradh ann an stòr agus fhaighinn air ais le pròiseactan eile a tha airson an gnìomh sin a chleachdadh. Bidh eagrachadh phròiseactan san dòigh seo a 'lùghdachadh gu mòr meud sgriobtaichean eile agus cuideachd a' dèanamh cinnteach gu bheil bunait còd beag agus furasta a dhearbhadh.

Mar a tha san eisimpleir gu h-àrd, tha a h-uile gnìomh logaidh mar __msg_info, __msg_error agus tha cuid eile, leithid aithisgean Slack, air an toirt a-steach fa leth common/* agus ceangal gu dinamach ann an suidheachaidhean eile mar daily_database_operation.sh.

Fàg siostam glan air chùl

Ma tha thu a’ luchdachadh goireas sam bith fhad ‘s a tha an sgriobt a’ ruith, thathas a’ moladh an dàta sin a stòradh ann an eòlaire co-roinnte le ainm air thuaiream, m.e. /tmp/AlRhYbD97/*. Faodaidh tu gineadairean teacsa air thuaiream a chleachdadh gus ainm an eòlaire a thaghadh:

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

Às deidh an obair a chrìochnachadh, faodar glanadh nan clàran sin a thoirt seachad anns na làimhseachadh dubhan air an deach beachdachadh gu h-àrd. Mura tèid aire a thoirt do chlàran sealach, bidh iad a’ cruinneachadh agus aig àm air choreigin ag adhbhrachadh dhuilgheadasan ris nach robh dùil air an aoigh, leithid diosc làn.

A 'cleachdadh faidhlichean glasaidh

Gu tric feumaidh tu dèanamh cinnteach nach eil ach aon eisimpleir de sgriobt a’ ruith air òstair aig àm sònraichte sam bith. Faodar seo a dhèanamh le bhith a 'cleachdadh faidhlichean glasaidh.

Mar as trice bidh mi a’ cruthachadh faidhlichean glasaidh a-steach /tmp/project_name/*.lock agus thoir sùil airson an làthaireachd aig toiseach an sgriobt. Bidh seo a’ cuideachadh leis an sgriobt crìochnachadh gu gràsmhor agus atharrachaidhean ris nach robh dùil a sheachnadh air staid an t-siostaim le sgriobt eile a’ ruith aig an aon àm. Chan eil feum air faidhlichean glasaidh ma tha feum agad air an aon sgriobt airson a chuir gu bàs aig an aon àm air aoigheachd sònraichte.

Tomhais agus leasaich

Gu tric feumaidh sinn a bhith ag obair le sgriobtaichean a bhios a’ ruith thar ùine mhòr, leithid obair stòr-dàta làitheil. Mar as trice bidh gnìomhan leithid seo a’ toirt a-steach sreath de cheumannan: luchdachadh dàta, sgrùdadh airson neo-riaghailteachdan, toirt a-steach dàta, cuir aithisgean inbhe, agus mar sin air adhart.

Ann an leithid de chùisean, bidh mi an-còmhnaidh a’ feuchainn ris an sgriobt a bhriseadh ann an sgriobtaichean beaga fa leth agus cunntas a thoirt air an inbhe agus an ùine cur gu bàs a’ cleachdadh:

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

Nas fhaide air adhart chì mi an ùine cur gu bàs le:

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

Cuidichidh seo mi le bhith a’ comharrachadh raointean duilgheadas/slaodach ann an sgriobtaichean a dh’ fheumas optimization.

Beannachd leat

Dè eile ri leughadh:

  1. Rach agus GPU caches.
  2. Eisimpleir de thagradh air a stiùireadh le tachartas stèidhichte air bileagan-lìn ann an stòradh stuth S3 de Mail.ru Cloud Solutions.
  3. An sianal teileagram againn mu chruth-atharrachadh didseatach.

Source: www.habr.com

Cuir beachd ann