Bash Scripting Fa'ata'ita'iga Sili: Ose Ta'iala vave i Fa'atuatuaina ma Fa'atinoga Bash Scripts

Bash Scripting Fa'ata'ita'iga Sili: Ose Ta'iala vave i Fa'atuatuaina ma Fa'atinoga Bash Scripts
Pepa puipui atigi e manapi

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.

Fa'ataina mo le toe fa'aoga ma le tulaga mama

Fa'ailoga fa'akomepiuta/ toe fa'aaogaina

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

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:

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

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.

manuia!

O le a se isi mea e faitau:

  1. Alu ma GPU caches.
  2. O se faʻataʻitaʻiga o se faʻataʻitaʻiga e faʻavae i luga o webhooks i le S3 mea e teu ai Mail.ru Cloud Solutions.
  3. O la matou auala telegram e uiga i suiga numera.

puna: www.habr.com

Faaopoopo i ai se faamatalaga