Bash Scripting Maitiro Akanakisisa: Gwaro Rinokurumidza Kuvimbika uye Kuita Bash Scripts

Bash Scripting Maitiro Akanakisisa: Gwaro Rinokurumidza Kuvimbika uye Kuita Bash Scripts
Shell wallpaper by manapi

Debugging bash scripts yakafanana nekutsvaga tsono muhuswa, kunyanya kana mitsva yekuwedzera ichionekwa mune iripo codebase pasina kutariswa nenguva yenyaya dzechimiro, kutema matanda uye kuvimbika. Iwe unogona kuzviwana uri mumamiriro ezvinhu akadaro kungave nekuda kwekukanganisa kwako kana kana uchigadzirisa mirwi yakaoma yezvinyorwa.

chikwata Mail.ru Cloud Solutions yakashandura chinyorwa chine kurudziro ichakubatsira iwe kunyora, kugadzirisa uye kuchengetedza zvinyorwa zvako zvirinani. Zvitende kana kwete, hapana chinokunda kugutsikana kwekunyora kwakachena, kugadzirira-kushandisa bash kodhi inoshanda nguva dzese.

Muchinyorwa, munyori anogovera zvaakadzidza mumakore mashoma apfuura, pamwe nezvimwe zvinowanzoitika zvikanganiso zvakamubata. Izvi zvakakosha nekuti wese mugadziri wesoftware, pane imwe nguva pabasa rake, anoshanda nemanyoro kuti aite otomatiki mabasa ebasa.

Vabati veriva

Mazhinji bash script andakasangana nawo haamboshandisi inoshanda yekuchenesa michina kana chimwe chinhu chisingatarisirwe chikaitika panguva yekunyora script.

Zvinoshamisa zvinogona kubuda kubva kunze, sekugamuchira chiratidzo kubva pakati. Kubata nyaya dzakadai kwakakosha zvakanyanya kuti uve nechokwadi chekuti zvinyorwa zvinovimbika zvakakwana kuti zvishande pamasisitimu ekugadzira. Ini kazhinji ndinoshandisa vanobuda vanobata kupindura kune mamiriro akaita seaya:

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 igoko rakavakirwa-mukati rairo rinokubatsira kunyoresa kuchenesa basa rinodaidzwa kana paine masaini. Nekudaro, kutarisirwa kwakakosha kunofanirwa kutorwa nevanobata senge SIGINT, izvo zvinoita kuti script irambe.

Mukuwedzera, muzviitiko zvakawanda iwe unofanirwa kubata chete EXIT, asi pfungwa ndeyokuti unogona kunyatsogadzirisa maitiro echinyorwa chechiratidzo chega chega.

Yakavakwa-mukati seti mabasa - kukurumidza kugumisa pane kukanganisa

Izvo zvakakosha kuti upindure kune zvikanganiso pazvinongoitika uye kumisa kuurayiwa nekukurumidza. Hapana chingave chakashata kupfuura kuramba uchimhanyisa murairo seizvi:

rm -rf ${directory_name}/*

Ndapota cherechedza kuti kuchinja directory_name kwete kutsunga.

Zvakakosha kushandisa mabasa akavakirwa-mukati kubata mamiriro akadai setse set -o errexit, set -o pipefail kana set -o nounset pakutanga kwechinyorwa. Aya mabasa anovimbisa kuti script yako ichabuda nekukurumidza kana ichinge yasangana chero isiri-zero yekubuda kodhi, kushandiswa kwezvakasiyana zvakasiyana, mirairo isingaite yakapfuudzwa papombi, zvichingodaro:

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

Cherechedza: akavakirwa-mukati mabasa akadai set -o errexit, ichabuda pane script kana paine "raw" yekudzoka kodhi (kunze kwe zero). Saka zviri nani kuunza tsika yekukanganisa kubata, semuenzaniso:

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

Kunyora zvinyorwa nenzira iyi zvinokumanikidza kuti ungwarire maitiro emirairo yese iri mugwaro uye kutarisira mukana wekukanganisa kusati kwakutora iwe kushamisika.

ShellCheck kuti uone zvikanganiso panguva yekuvandudza

Zvakakodzera kubatanidza chinhu chakadai ShellCheck mukuvandudza kwako uye kuyedza mapaipi kuti utarise yako bash kodhi inopesana neakanakisa maitiro.

Ini ndinoishandisa munzvimbo dzangu dzekusimudzira nharaunda kuti ndiwane mishumo pane syntax, semantics, uye zvimwe zvikanganiso mukodhi yandinogona kunge ndakapotsa ndichigadzira. Ichi chishandiso chekuongorora static kune ako bash script uye ini ndinokurudzira zvikuru kuishandisa.

Uchishandisa yako yekubuda macode

Dzosera macode muPOSIX haingori zero kana imwe chete, asi zero kana isiri-zero kukosha. Shandisa aya maficha kudzorera tsika yekukanganisa macode (pakati pe201-254) kune akasiyana zvikanganiso.

Ruzivo urwu runogona kuzoshandiswa nemamwe magwaro anoputira ako kuti unzwisise kuti ndeipi mhando yekukanganisa yakaitika uye woita saizvozvo:

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

Cherechedza: ndokumbira uchenjere nemazita akasiyana aunotsanangura kudzivirira netsaona kupfuudza misiyano yenzvimbo.

Kutema mabasa

Yakanaka uye yakarongeka matanda yakakosha kuti unzwisise zviri nyore mhedzisiro yescript yako. Sezvimwe nemimwe mitauro yemhando yepamusoro, ini ndinogara ndichishandisa mabasa ekutema matanda muzvinyorwa zvangu zvebash, senge. __msg_info, __msg_error uye zvichingodaro.

Izvi zvinobatsira kupa chimiro chakamisikidzwa chekutema nekuita shanduko munzvimbo imwechete chete:

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

Ini kazhinji ndinoedza kuve neimwe mhando yemaitiro mune yangu zvinyorwa __init, uko misiyano yelogger yakadaro uye mamwe masisitimu akasiyana anotangwa kana kusetwa kune default kukosha. Izvi zvinosiyana zvinogona zvakare kusetwa kubva kune yekuraira mutsara sarudzo panguva yekukumbira script.

Somuenzaniso, chimwe chinhu chakadai:

$ ./run-script.sh --debug

Kana iyo script yaitwa, inova nechokwadi chekuti masisitimu-yakawanda marongero akaiswa kune yakasarudzika kukosha kana ichidikanwa, kana kuti inotangwa kune chimwe chinhu chakakodzera kana zvichidikanwa.

Ini ndinowanzo simbisa sarudzo yezvekutanga uye zvekusaita pakutengeserana pakati pemushandisi interface uye neruzivo rwemagadzirirwo ayo mushandisi anogona / anofanira kuongorora mazviri.

Architecture yekushandisa zvakare uye yakachena system mamiriro

Modular/reusable code

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

Ini ndinochengeta yakaparadzana repository yandinogona kushandisa kutanga chirongwa chitsva / bash script yandinoda kugadzira. Chinhu chipi nechipi chinogona kushandiswazve chinogona kuchengetwa mudura uye kutorwa nemamwe mapurojekiti anoda kushandisa basa iroro. Kuronga mapurojekiti nenzira iyi kunoderedza zvakanyanya saizi yemamwe magwaro uye zvakare kunovimbisa kuti iyo kodhi base idiki uye nyore kuyedza.

Semumuenzaniso uri pamusoro, mabasa ese ekutema akadai se __msg_info, __msg_error uye mamwe, senge Slack mishumo, arimo akaparadzana mukati common/* uye zvine simba batanidza mune mamwe mamiriro senge daily_database_operation.sh.

Siya shure kwakachena hurongwa

Kana iwe uri kurodha chero zviwanikwa panguva iyo script iri kushanda, zvinokurudzirwa kuchengetedza data rese rakadaro mudhairekitori rakagovaniswa rine zita risingaite, semuenzaniso. /tmp/AlRhYbD97/*. Iwe unogona kushandisa zvisina kujairika mameseji jenareta kusarudza zita redhairekitori:

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

Mushure mekupedzwa kwebasa, kucheneswa kwemadhairekitori akadaro anogona kupihwa mukubata hoko kukurukurwa pamusoro apa. Kana madhairekitori enguva pfupi akasatariswa, anounganidza uye pane imwe nhanho anokonzera matambudziko asingatarisirwi pane anotambira, akadai sedhisiki rakazara.

Kushandisa mafaira ekukiya

Kazhinji iwe unofanirwa kuve nechokwadi chekuti chiitiko chimwe chete chegwaro chiri kushanda pane anogamuchira chero nguva yakapihwa. Izvi zvinogona kuitwa uchishandisa lock mafaira.

Ini kazhinji ndinogadzira mafaira ekukiya mukati /tmp/project_name/*.lock uye tarisa kuvapo kwavo pakutanga kwechinyorwa. Izvi zvinobatsira kuti script ipere zvine nyasha uye kudzivirira shanduko dzisingatarisirwe kune system state neimwe script inomhanya mukuwirirana. Kiya mafaera haadiwe kana iwe uchida iro script kuti riitwe mukuwirirana pane akapihwa mugamuchiri.

Kuyera uye kunatsiridza

Kazhinji tinoda kushanda nemagwaro anomhanya kwenguva yakareba, senge zuva nezuva mashandiro edhatabhesi. Mashandiro akadai anowanzo sanganisira kutevedzana kwematanho: kurodha data, kutarisa kune anomalies, kupinza data kunze, kutumira mamiriro mamiriro, zvichingodaro.

Mumamiriro ezvinhu akadaro, ini ndinogara ndichiedza kutyora script kuita zvinyorwa zvidiki zvakasiyana uye nditaure chimiro chavo uye nguva yekuuraya ndichishandisa:

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

Gare gare ndinogona kuona nguva yekuuraya ne:

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

Izvi zvinondibatsira kuona dambudziko / nzvimbo dzinononoka mune zvinyorwa zvinoda optimization.

Good luck!

Zvimwe zvekuverenga:

  1. Enda uye GPU caches.
  2. Muenzaniso wechiitiko chinofambiswa nechiitiko chakavakirwa pawebhooks muS3 chinhu chekuchengetedza Mail.ru Cloud Solutions.
  3. Yedu teregiramu chiteshi nezve shanduko yedhijitari.

Source: www.habr.com

Voeg