Debugging bash scripts e pei o le suʻeina o se nila i totonu o vaomago, aemaise lava pe a faʻaalia ni faʻaopoopoga fou i le codebase o loʻo i ai nei e aunoa ma se iloiloga taimi o mataupu o le fausaga, logging ma le faʻamaoni. E mafai ona e maua oe i ia tulaga pe ona o au lava mea sese poʻo le taimi e pulea ai faʻaputuga lavelave o tusitusiga.
au Mail.ru Cloud Solutions fa'aliliuina se tala fa'atasi ai ma fautuaga o le a fesoasoani ia te oe e tusi, debug ma tausia lelei au tusitusiga. Talitonu i ai pe leai, e leai se mea e sili atu i le faamalieina o le tusitusi mama, saunia-e-fa'aoga bash code e aoga i taimi uma.
I totonu o le tusiga, o loʻo faʻamatalaina e le tusitala mea na ia aʻoaʻoina i nai tausaga ua tuanaʻi, faʻapea foʻi ma nisi o mea sese masani na mafua ai ona ia le mataala. E taua tele lenei aua o soʻo se atinaʻe polokalama, i se taimi i la latou galuega, e galulue faʻatasi ma faʻamaumauga e faʻautometi ai galuega masani.
Tagata fai mailei
Ole tele ole bash scripts ou te le'i fa'aogaina se masini fa'amama lelei pe a tupu se mea e le'i fa'amoemoeina ile fa'atinoina o tusitusiga.
O fa'ate'ia e mafai ona tula'i mai fafo, e pei o le mauaina o se fa'ailoga mai le totonugalemu. O le taulimaina o ia mataupu e matua taua tele ina ia mautinoa o loʻo faʻatuatuaina tusitusiga e faʻatautaia i luga o faiga gaosiga. E masani ona ou faʻaogaina tagata e alu i fafo e tali atu i faʻataʻitaʻiga e pei o lenei:
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 ose atigi fa'atonuga e fesoasoani ia te oe e resitalaina se galuega fa'amama e ta'ua pe a iai so'o se fa'ailoga. Ae ui i lea, e tatau ona faia le tausiga faʻapitoa i tagata faʻapipiʻi e pei o SIGINT, lea e mafua ai ona faʻaumatia le tusitusiga.
E le gata i lea, i le tele o tulaga e tatau ona e pu'e EXIT, ae o le manatu e mafai ona e faʻavasegaina le amio a le tusitusiga mo faʻailoga taʻitasi.
Galuega fa'apipi'i fa'apipi'i - fa'amutaina vave ile mea sese
E taua tele le tali atu i mea sese i le taimi lava e tupu ai ma taofi le faʻatinoina vave. E leai se mea e sili atu le leaga nai lo le faʻaauauina pea o se faʻatonuga e pei o lenei:
rm -rf ${directory_name}/*
Faamolemole ia matau o le fesuiaiga directory_name e lei fuafuaina.
E taua tele le fa'aogaina o galuega fa'apipi'i e fa'atautaia ai ia fa'aaliga set, pei o le set -o errexit, set -o pipefail poʻo set -o nounset i le amataga o le tusitusiga. O nei galuega e faʻamautinoa ai o le a alu ese lau tusitusiga i le taimi lava e fetaui ai ma soʻo se code exit e le-zero, faʻaogaina o fesuiaiga e leʻi faʻamalamalamaina, tulafono le aoga na pasia i luga o se paipa, ma isi mea faapena:
#!/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
Manatua: galuega faufale e pei o set -o errexit, o le a alu ese mai le tusitusiga i le taimi lava e iai se "raw" toe faafoi code (e ese mai le zero). O le mea lea e sili atu le faʻalauiloaina o le faʻaaogaina o mea sese, mo se faʻataʻitaʻiga:
#!/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
O le tusiaina o tusitusiga i lenei auala e faʻamalosia ai oe e faʻaeteete atili i le amio a poloaiga uma o loʻo i totonu o le tusitusiga ma faʻatali le avanoa e tupu ai se mea sese ae e te leʻi teʻi.
ShellCheck e iloa ai mea sese i le taimi o le atinaʻe
E aoga le tu'ufa'atasia o se mea faapena ShellCheck i totonu o lau atinaʻe ma suʻega paipa e siaki lau code bash faʻasaga i faiga sili ona lelei.
Ou te faʻaaogaina i laʻu siosiomaga atinaʻe i le lotoifale e maua ai lipoti i luga o le syntax, semantics, ma nisi o mea sese i le code atonu na ou misia aʻo atiaʻe. Ole mea lea ole su'esu'ega tu'ufa'atasi mo au fa'amaumauga bash ma ou te fautuaina tele le fa'aaogaina.
Fa'aaogā lau lava fa'ailoga e alu ese ai
Fa'afo'i fa'ailoga i le POSIX e le na'o le zero po'o le tasi, ae o le zero po'o le le-zero tau. Fa'aoga nei foliga e toe fa'afo'i ai fa'ailoga sese masani (i le va o le 201-254) mo mataupu sese eseese.
O lenei faʻamatalaga e mafai ona faʻaaogaina e isi tusitusiga e afifi ai oe e malamalama lelei ai pe o le a le ituaiga o mea sese na tupu ma tali mai e tusa ai:
#!/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
}
Manatua: fa'amolemole fa'aeteete fa'apitoa i igoa fesuia'i e te fa'auigaina e 'alofia ai le fa'afuase'i ona fa'asili suiga o le si'osi'omaga.
Galuega fa'amau
E taua tele ma fa'atulagaina fa'amaumauga e faigofie ona malamalama i taunu'uga o lau tusitusiga. E pei o isi gagana faʻapolokalame maualuga, ou te faʻaogaina i taimi uma galuega faʻapipiʻi masani i laʻu tusitusiga bash, pei o __msg_info, __msg_error ma isi.
E fesoasoani lea i le tu'uina atu o se fa'asologa fa'asologa o la'au e ala i le faia o suiga i na'o le tasi nofoaga:
#!/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"
E masani ona ou taumafai e iai se ituaiga masini i aʻu tusitusiga __init, pe a fa'auluina ia fa'ailoga logger ma isi suiga fa'aleaogaina pe seti i tau fa'aletonu. O nei fesuiaiga e mafai foi ona seti mai filifiliga laina laina i le taimi o le faʻaogaina o tusitusiga.
Mo se faʻataʻitaʻiga, se mea e pei o:
$ ./run-script.sh --debug
Pe a faʻataunuʻuina sea tusitusiga, e faʻamautinoaina o loʻo faʻatulagaina tulaga lautele i tulaga faʻaletonu pe a manaʻomia, poʻo le itiiti ifo i le amataina i se mea talafeagai pe a manaʻomia.
E masani ona ou faʻavaeina le filifiliga o le mea e amatalia ma le mea e le tatau ona faia i luga o se fefaʻatauaʻiga i le va o le faʻaoga faʻaoga ma faʻamatalaga o faʻasalalauga e mafai e le tagata faʻaoga ona / tatau ona suʻesuʻeina.
Ou te teuina se isi fale teu oloa e mafai ona ou faʻaogaina e amata ai se galuega fou / bash script ou te manaʻo e atiaʻe. So'o se mea e mafai ona toe fa'aoga e mafai ona teuina i totonu o se fale teu oloa ma toe maua mai e isi poloketi e mana'o e fa'aoga lena galuega. O le faʻatulagaina o poloketi i lenei auala e faʻaitiitia ai le tele o isi tusitusiga ma faʻamautinoa foi o le faʻavae code e laʻititi ma faigofie ona suʻeina.
E pei o le faʻataʻitaʻiga o loʻo i luga, o galuega faʻapipiʻi uma e pei ole __msg_info, __msg_error ma isi, e pei o Slack lipoti, o loʻo tuʻufaʻatasia i totonu common/* ma feso'ota'i malosi i isi fa'aaliga pei daily_database_operation.sh.
Tuu i tua se faiga mama
Afai o loʻo e utaina soʻo se punaoa aʻo faʻagasolo le tusitusiga, e fautuaina e teu uma ia faʻamatalaga i se lisi faʻasoa ma se igoa faʻafuaseʻi, eg. /tmp/AlRhYbD97/*. E mafai ona e fa'aogaina fa'aupuga fa'asologa e filifili ai le igoa fa'atonu:
A mae'a galuega, fa'amamāina o ia fa'atonuga e mafai ona tu'uina atu i totonu o la'au fa'amau o lo'o talanoaina i luga. Afai e le o tausia faʻamaumauga le tumau, latou te faʻaputuina ma i se taimi e mafua ai faʻafitauli faʻafuaseʻi i luga o le talimalo, e pei o se tisiki atoa.
Fa'aaogā faila loka
E masani ona e mana'omia e fa'amautinoa e na'o le tasi le fa'ata'ita'iga o se fa'amaumauga o lo'o fa'agasolo i luga o se talimalo i so'o se taimi. E mafai ona faia lenei mea i le faʻaogaina o faila loka.
E masani ona ou faia faila loka i totonu /tmp/project_name/*.lock ma siaki mo lo latou i ai i le amataga o le tusitusiga. E fesoasoani lea i le fa'amutaina lelei o le tusitusiga ma aloese mai suiga fa'afuase'i i le tulaga o le faiga e se isi fa'amaumauga o lo'o fa'agasolo tutusa. Loka faila e le manaʻomia pe afai e te manaʻomia le tusitusiga lava e tasi e faʻatino tutusa i luga o se talimalo tuʻuina atu.
Fua ma faaleleia
E masani ona matou manaʻomia le galulue faʻatasi ma faʻamaumauga e taʻavale i taimi uumi, e pei o faʻamaumauga o faʻamaumauga i aso uma. O ia gaioiga e masani ona aofia ai se faʻasologa o laasaga: faʻapipiʻiina o faʻamaumauga, siaki mo faʻalavelave, faʻaulufaleina o faʻamaumauga, auina atu lipoti tulaga, ma isi.
I ia tulaga, ou te taumafai i taimi uma e momotu le tusitusiga i ni tusitusiga laiti eseese ma lipoti atu o latou tulaga ma taimi faʻaaoga e faʻaaoga ai:
time source "${filepath}" "${args}">> "${LOG_DIR}/RUN_LOG" 2>&1
Mulimuli ane e mafai ona ou vaʻaia le taimi faʻataunuʻu ma:
tac "${LOG_DIR}/RUN_LOG.txt" | grep -m1 "real"
E fesoasoani lea ia te aʻu e iloa ai faʻafitauli / faʻagesegese vaega i tusitusiga e manaʻomia le faʻaleleia.