Fomba fanao tsara indrindra amin'ny Bash Scripting: TorolΓ lana haingana ho an'ny Script Bash azo itokisana sy mahomby

Fomba fanao tsara indrindra amin'ny Bash Scripting: TorolΓ lana haingana ho an'ny Script Bash azo itokisana sy mahomby
Shell wallpaper by manapi

Ny fametahana ny script bash dia toy ny mitady fanjaitra ao anaty mololo, indrindra rehefa misy fanampim-baovao hita ao amin'ny codebase efa misy nefa tsy misy fiheverana ara-potoana ny olana momba ny rafitra, ny fitrandrahana ary ny fahatokisana. Afaka mahita ny tenanao amin'ny toe-javatra toy izany ianao na noho ny hadisoanao manokana na rehefa mitantana ireo sora-baventy be pitsiny.

ekipa Mail.ru Cloud Solutions nandika lahatsoratra miaraka amin'ny tolo-kevitra hanampy anao hanoratra, debug ary hitazona tsara kokoa ny scripto. Minoa na tsia, tsy misy mahamenatra ny fahafaham-po amin'ny fanoratana kaody bash madio sy vonona hampiasaina izay miasa isaky ny mandeha.

Ao amin'ny lahatsoratra, ny mpanoratra dia nizara ny zavatra nianarany nandritra ny taona vitsivitsy lasa izay, ary koa ny fahadisoana mahazatra sasany izay nahatonga azy tsy hiambina. Zava-dehibe izany satria ny mpamorona rindrambaiko tsirairay, amin'ny fotoana iray amin'ny asany, dia miara-miasa amin'ny script mba hanamafisana ny asa mahazatra.

Mpitantana fandrika

Ny ankamaroan'ny script bash hitako dia tsy mampiasa fomba fanadiovana mahomby mihitsy rehefa misy zavatra tsy ampoizina mitranga mandritra ny famonoana script.

Mety hipoitra avy any ivelany ny tsy ampoizina, toy ny fandraisana famantarana avy amin'ny fotony. Tena zava-dehibe ny fikarakarana tranga toy izany mba hahazoana antoka fa azo ianteherana ny script mba handehanana amin'ny rafitra famokarana. Matetika aho no mampiasa mpitantana fivoahana mba hamaliana toe-javatra toy izao:

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 dia baiko voaorina ao anaty akorandriaka izay manampy anao hisoratra anarana asa fanadiovana izay antsoina raha misy famantarana. Na izany aza, ny fikarakarana manokana dia tokony horaisina amin'ny mpikarakara toy ny SIGINT, izay mahatonga ny script hanakana.

Ankoatra izany, amin'ny ankamaroan'ny toe-javatra dia tokony hisambotra ihany EXIT, fa ny hevitra dia hoe azonao atao ny mampifanaraka ny fihetsiky ny script ho an'ny famantarana tsirairay.

Fampiasa napetraka ao anatiny - famaranana haingana amin'ny fahadisoana

Tena zava-dehibe ny mamaly ny fahadisoana raha vao mitranga izany ary atsahatra haingana ny famonoana. Tsy misy zavatra ratsy kokoa noho ny fanohizana baiko toy izao:

rm -rf ${directory_name}/*

Mariho fa ny variable directory_name tsy tapa-kevitra.

Zava-dehibe ny fampiasana fiasa naorina mba hiatrehana toe-javatra toy izany settoy set -o errexit, set -o pipefail na set -o nounset eo am-piandohan'ny script. Ireo fiasa ireo dia manome antoka fa hivoaka ny scripto raha vantany vao mahita kaody fivoahana tsy aotra, fampiasana fari-pahalalana tsy voafaritra, baiko tsy mety mandalo amin'ny sodina, sy ny sisa:

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

Fanamarihana: naorina-in asa toy ny set -o errexit, dia hivoaka ny script raha vantany vao misy kaody miverina "manta" (ankoatra ny aotra). Noho izany dia tsara kokoa ny mampiditra ny fikarakarana fahadisoana mahazatra, ohatra:

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

Manery anao hitandrina bebe kokoa momba ny fitondran-tenan'ny baiko rehetra ao amin'ny script ny fanoratana script amin'izany fomba izany ary hiandrandra ny mety hisian'ny hadisoana alohan'ny hahatongavanao tampoka.

ShellCheck hahitana lesoka mandritra ny fampandrosoana

Mendrika ny mampiditra zavatra toy izany ShellCheck ao amin'ny fampivoaranao sy ny fantsom-pitsapana hanamarinana ny code bash anao amin'ny fanao tsara indrindra.

Ampiasaiko ao amin'ny tontolon'ny fampandrosoana eo an-toerana izany mba hahazoana tatitra momba ny syntax, semantika, ary ny lesoka sasany ao amin'ny code izay mety ho tsy hitako teo am-pandrosoana. Ity dia fitaovana famakafakana static ho an'ny script bash anao ary tena manoro hevitra ny hampiasa azy aho.

Mampiasa ny kaody fivoahanao manokana

Ny kaody miverina ao amin'ny POSIX dia tsy aotra na iray fotsiny, fa aotra na sanda tsy aotra. Ampiasao ireo endri-javatra ireo mba hamerenana ny kaody fahadisoana mahazatra (eo anelanelan'ny 201-254) ho an'ny tranga maro samihafa.

Ity fampahalalana ity dia azo ampiasaina amin'ny sora-baventy hafa mandrakotra ny anao mba hahatakarana tsara ny karazana fahadisoana nitranga sy ny fihetsika mifanaraka amin'izany:

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

Fanamarihana: mitandrema tsara indrindra amin'ireo anarana miovaova faritanao mba hisorohana ny tsy fahatomombanan'ny fari-piainan'ny tontolo iainana.

Fampiasana logging

Zava-dehibe ny fanoratana tsara tarehy sy voarafitra mba hahatakarana mora foana ny valin'ny scripto. Tahaka ny amin'ny fiteny fandaharana avo lenta hafa, dia mampiasa fonctionnaire logging an-tany foana aho amin'ny script bash-ko, toy ny __msg_info, __msg_error sy ny sisa.

Izany dia manampy amin'ny fanomezana rafitra fanoratana manara-penitra amin'ny fanaovana fanovana amin'ny toerana iray ihany:

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

Matetika aho no manandrana manana karazana mekanika ao amin'ny script __init. Ireo variables ireo dia azo apetraka amin'ny safidy andalana baiko mandritra ny fiantsoana script.

Ohatra, zavatra toy ny:

$ ./run-script.sh --debug

Rehefa vita ny script toy izany, dia miantoka fa apetraka amin'ny soatoavina default raha ilaina izany, na farafaharatsiny amin'ny zavatra mety raha ilaina izany.

Matetika aho no mametraka ny safidy ny amin'izay hatao voalohany sy ny tsy tokony hatao amin'ny fifanakalozam-bola eo amin'ny mpampiasa interface tsara sy ny antsipirihan'ny fanamafisana izay azon'ny mpampiasa / tokony hodinihina.

Architecture ho an'ny fampiasana indray sy ny rafitra madio

Modular / azo ampiasaina indray

β”œβ”€β”€ framework
β”‚   β”œβ”€β”€ common
β”‚   β”‚   β”œβ”€β”€ loggers.sh
β”‚   β”‚   β”œβ”€β”€ mail_reports.sh
β”‚   β”‚   └── slack_reports.sh
β”‚   └── daily_database_operation.sh

Mitazona tahiry manokana azoko ampiasaina aho hanombohana tetikasa vaovao/bash script izay tiako hamolavola. Ny zavatra rehetra azo ampiasaina indray dia azo tehirizina ao anaty tahiry ary alaina amin'ny tetikasa hafa izay te hampiasa izany fampiasa izany. Ny fikarakarana tetikasa amin'izany fomba izany dia mampihena be ny haben'ny script hafa ary miantoka ihany koa fa kely ny fototry ny kaody ary mora andrana.

Tahaka ny amin'ny ohatra etsy ambony, ny fiasan'ny log rehetra toy ny __msg_info, __msg_error ary ny hafa, toy ny tatitra Slack, dia voarakitra misaraka common/* ary mifandray mavitrika amin'ny toe-javatra hafa toy ny daily_database_operation.sh.

Avelao ny rafitra madio

Raha mameno loharanon-karena ianao rehefa mandeha ny script, dia asaina mitahiry izany rehetra izany ao anaty lahatahiry iombonana miaraka amin'ny anarana kisendrasendra, oh. /tmp/AlRhYbD97/*. Azonao atao ny mampiasa mpamorona lahatsoratra kisendrasendra mba hisafidianana ny anaran'ny lahatahiry:

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

Aorian'ny fahavitan'ny asa dia azo atao ny fanadiovana ny lahatahiry toy izany ao amin'ny mpanentana fantso voaresaka etsy ambony. Raha tsy voakarakara ny lahatahiry vonjimaika, dia miangona izy ireo ary amin'ny dingana sasany dia miteraka olana tsy ampoizina amin'ny mpampiantrano, toy ny kapila feno.

Mampiasa rakitra hidin-trano

Matetika ianao dia mila miantoka fa ohatra iray amin'ny script iray ihany no mandeha amin'ny mpampiantrano amin'ny fotoana rehetra. Izany dia azo atao amin'ny fampiasana rakitra hidin-trano.

Matetika aho no mamorona rakitra hidin-trano /tmp/project_name/*.lock ary jereo ny fisian'izy ireo eo am-piandohan'ny script. Izany dia manampy ny script hampitsahatra tsara sy hisorohana ny fiovana tsy ampoizina amin'ny rafitry ny rafitra amin'ny alàlan'ny script hafa mandeha amin'ny parallèle. Tsy ilaina ny rakitra hidin-trano raha toa ka mila script mitovy amin'ny hotanterahina amin'ny mpampiantrano iray ianao.

Mandrefy sy manatsara

Matetika isika dia mila miara-miasa amin'ny script izay mandeha mandritra ny fotoana maharitra, toy ny fampandehanana angon-drakitra isan'andro. Ny asa toy izany dia mazΓ na misy filaharana dingana: fampidinana angon-drakitra, fanamarinana ny tsy mety, fanafarana angona, fandefasana tatitra momba ny sata, sns.

Amin'ny toe-javatra toy izany, miezaka foana aho hanapaka ny script ho script kely misaraka ary mitatitra ny satany sy ny fotoana famonoana azy amin'ny fampiasana:

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

Taty aoriana dia afaka mahita ny fotoana famonoana aho miaraka amin'ny:

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

Izany dia manampy ahy hamantatra olana / faritra miadana amin'ny script mila fanatsarana.

Mirary soa!

Inona koa no vakiana:

  1. Mandehana ary GPU cache.
  2. Ohatra iray amin'ny fampiharana entin'ny hetsika mifototra amin'ny webhooks amin'ny fitahirizana zavatra S3 an'ny Mail.ru Cloud Solutions.
  3. Ny fantsona telegrama momba ny fanovana nomerika.

Source: www.habr.com

Add a comment