Njira Zabwino Kwambiri za Bash Scripting: Chitsogozo Chachangu cha Ma Bash Scripts Odalirika ndi Magwiridwe

Njira Zabwino Kwambiri za Bash Scripting: Chitsogozo Chachangu cha Ma Bash Scripts Odalirika ndi Magwiridwe
Shell wallpaper by manapi

Kuwongolera zolemba za bash kuli ngati kuyang'ana singano mumsipu wa udzu, makamaka pamene zowonjezera zatsopano zikuwonekera mu codebase yomwe ilipo popanda kulingalira panthawi yake nkhani za kapangidwe, kudula mitengo ndi kudalirika. Mutha kupezeka mumikhalidwe yotere chifukwa cha zolakwa zanu kapena poyang'anira milu yovuta ya zolemba.

timu Mail.ru Cloud Solutions anamasulira nkhani yokhala ndi malingaliro omwe angakuthandizeni kulemba, kukonza zolakwika ndikusunga zolemba zanu bwino. Khulupirirani kapena ayi, palibe chomwe chimapambana kukhutitsidwa ndi kulemba koyera, kokonzeka kugwiritsa ntchito bash code yomwe imagwira ntchito nthawi zonse.

M'nkhaniyi, wolemba akugawana zomwe adaphunzira m'zaka zingapo zapitazi, komanso zolakwika zina zomwe zimamugwira. Izi ndizofunikira chifukwa aliyense wopanga mapulogalamu, nthawi ina pa ntchito yawo, amagwira ntchito ndi zolemba kuti azingogwira ntchito nthawi zonse.

Ogwira misampha

Zolemba zambiri za bash zomwe ndidakumana nazo sizigwiritsa ntchito njira yotsuka bwino pomwe china chake chosayembekezereka chikachitika polemba.

Zodabwitsa zimatha kubwera kuchokera kunja, monga kulandira chizindikiro kuchokera pachimake. Kusamalira milandu yotereyi ndikofunikira kwambiri kuwonetsetsa kuti zolembedwazo ndi zodalirika kuti zitha kuyendetsedwa pamakina opanga. Nthawi zambiri ndimagwiritsa ntchito othandizira otuluka kuti ndiyankhe pazochitika monga izi:

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 ndi chipolopolo chopangidwa ndi lamulo chomwe chimakuthandizani kulembetsa ntchito yoyeretsa yomwe imatchedwa ngati zizindikiro zilizonse. Komabe, chisamaliro chapadera chiyenera kutengedwa ndi ogwira ntchito monga SIGINT, zomwe zimapangitsa kuti script iwonongeke.

Kuphatikiza apo, nthawi zambiri muyenera kugwira EXIT, koma lingaliro ndiloti mutha kusintha makonda a script pa chizindikiro chilichonse.

Ntchito zomangidwira - kutha mwachangu pakulakwitsa

Ndikofunikira kwambiri kuyankha zolakwa zikangochitika ndikusiya kupha mwachangu. Palibe chomwe chingakhale choyipa kuposa kupitiliza kuyendetsa lamulo monga ili:

rm -rf ${directory_name}/*

Chonde dziwani kuti variable directory_name osatsimikiza.

Ndikofunikira kugwiritsa ntchito zida zomangidwira kuti zithandizire zochitika ngati izi setmonga set -o errexit, set -o pipefail kapena set -o nounset kumayambiriro kwa script. Ntchito izi zimawonetsetsa kuti script yanu idzatuluka ikangokumana ndi code yotuluka yopanda ziro, kugwiritsa ntchito mitundu yosadziwika, malamulo olakwika omwe amadutsa papaipi, ndi zina zotero:

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

Taonani: ntchito zomangidwa monga set -o errexit, idzatuluka pa script pakakhala "yaiwisi" yobwereza code (kupatula ziro). Chifukwa chake ndikwabwino kuyambitsa zowongolera zolakwika, mwachitsanzo:

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

Kulemba zolembera motere kumakukakamizani kuti mukhale osamala kwambiri ndi machitidwe a malamulo onse omwe ali mu script ndi kuyembekezera kutheka kwa cholakwika chisanakuchititseni modzidzimutsa.

ShellCheck kuti muwone zolakwika pakukula

Ndikoyenera kuphatikiza chinthu chonga ShellCheck mukukula kwanu ndikuyesa mapaipi kuti muwone nambala yanu ya bash motsutsana ndi machitidwe abwino.

Ndimagwiritsa ntchito m'malo omwe ndikutukuka kwanuko kuti ndipeze malipoti pamawu, ma semantics, ndi zolakwika zina mu code zomwe mwina ndidaziphonya popanga. Ichi ndi chida chowunikira chokhazikika pamawu anu a bash ndipo ndikupangira kugwiritsa ntchito.

Kugwiritsa ntchito ma code anu otuluka

Ma code obwelera mu POSIX sangokhala ziro kapena chimodzi, koma ziro kapena mtengo wosakhala ziro. Gwiritsani ntchito izi kuti mubwezere ma code olakwika (pakati pa 201-254) pazolakwa zosiyanasiyana.

Izi zitha kugwiritsidwa ntchito ndi zolemba zina zomwe zimakutira zanu kuti mumvetsetse mtundu wa cholakwika chomwe chidachitika ndikuchita moyenerera:

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

Taonani: chonde samalani makamaka ndi mayina osinthika omwe mumawamasulira kuti mupewe kupitilira mwangozi masinthidwe achilengedwe.

Ntchito zodula mitengo

Kudula mitengo yokongola komanso yokhazikika ndikofunikira kuti mumvetsetse bwino zotsatira za script yanu. Mofanana ndi zilankhulo zina zapamwamba kwambiri, nthawi zonse ndimagwiritsa ntchito zolemba zanga za bash, monga __msg_info, __msg_error ndi zina zotero.

Izi zimathandiza kuti pakhale ndondomeko yodula mitengo posintha malo amodzi okha:

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

Nthawi zambiri ndimayesetsa kukhala ndi njira ina m'malemba anga __init, kumene zodula mitengo yotereyi ndi zosintha zina zamakina zimayambika kapena zimayikidwa ku zikhalidwe zosasinthika. Zosinthazi zitha kukhazikitsidwanso kuchokera pazosankha za mzere wamalamulo panthawi yoyitanitsa script.

Mwachitsanzo, zinthu monga:

$ ./run-script.sh --debug

Zolemba zotere zikachitika, zimawonetsetsa kuti zosintha zapadongosolo zimayikidwa kuti zikhale zokhazikika ngati zikufunika, kapena kukhazikitsidwa ku chinthu choyenera ngati kuli kofunikira.

Nthawi zambiri ndimasankha zomwe ndiyenera kuyambitsa ndi zomwe sindiyenera kuchita pakugulitsa pakati pa mawonekedwe ogwiritsira ntchito ndi tsatanetsatane wa masanjidwe omwe wogwiritsa ntchito atha / akuyenera kuyang'ana.

Zomangamanga zogwiritsanso ntchito komanso kuyeretsa dongosolo

Kodi modular/reusable

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

Ndimasunga malo osiyana omwe ndingagwiritse ntchito poyambitsa pulojekiti yatsopano/bash yomwe ndikufuna kupanga. Chilichonse chomwe chitha kugwiritsidwanso ntchito chitha kusungidwa munkhokwe ndikubwezedwa ndi mapulojekiti ena omwe akufuna kugwiritsa ntchito ntchitoyi. Kukonzekera mapulojekiti motere kumachepetsa kwambiri kukula kwa zolemba zina komanso kumatsimikizira kuti maziko a code ndi ochepa komanso osavuta kuyesa.

Monga chitsanzo pamwambapa, ntchito zonse kudula mitengo monga __msg_info, __msg_error ndi ena, monga malipoti a Slack, ali padera common/* ndi dynamically kugwirizana mu zochitika zina monga daily_database_operation.sh.

Siyani dongosolo loyera

Ngati mukukweza zinthu zilizonse pamene script ikugwira ntchito, ndi bwino kusunga deta yonseyi mu bukhu logawana ndi dzina losasintha, mwachitsanzo. /tmp/AlRhYbD97/*. Mutha kugwiritsa ntchito majenereta osasintha kuti musankhe dzina lachikwatu:

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

Mukamaliza ntchito, kuyeretsa zolembera zoterezi zitha kuperekedwa m'mabowo omwe takambirana pamwambapa. Ngati zolembera zosakhalitsa sizisamalidwa, zimadziunjikira ndipo nthawi zina zimayambitsa mavuto osayembekezereka kwa wolandirayo, monga disk yonse.

Kugwiritsa ntchito loko mafayilo

Nthawi zambiri muyenera kuwonetsetsa kuti gawo limodzi lokha la script likuyenda pa wolandila nthawi iliyonse. Izi zitha kuchitika pogwiritsa ntchito loko mafayilo.

Nthawi zambiri ndimapanga mafayilo otsekera mkati /tmp/project_name/*.lock ndipo fufuzani kuti alipo kumayambiriro kwa script. Izi zimathandiza script kuyimitsa mokoma ndikupewa kusintha kosayembekezereka kwa dongosolo ndi script ina yomwe ikuyenda molingana. Mafayilo otsekera sakufunika ngati mukufuna script yomweyi kuti ipangidwe mofanana ndi wolandira.

Yezerani ndi kukonza

Nthawi zambiri timafunika kugwira ntchito ndi zolemba zomwe zimayenda nthawi yayitali, monga ntchito zatsiku ndi tsiku. Zochita zoterezi nthawi zambiri zimakhala ndi masitepe angapo: kutsitsa deta, kuyang'ana zolakwika, kutumiza deta, kutumiza malipoti a momwe zinthu zilili, ndi zina zotero.

Zikatero, nthawi zonse ndimayesetsa kuthyola script kukhala zolemba zazing'ono ndikuwonetsa momwe zilili komanso nthawi yogwiritsira ntchito:

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

Pambuyo pake nditha kuwona nthawi yokonzekera ndi:

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

Izi zimandithandiza kuzindikira madera omwe ali ndi vuto/ochedwa m'malemba omwe amafunikira kukhathamiritsa.

Zabwino zonse!

Zomwe mungawerenge:

  1. Pitani ndi ma cache a GPU.
  2. Chitsanzo cha pulogalamu yoyendetsedwa ndi zochitika potengera ma webhooks mu S3 chinthu chosungira cha Mail.ru Cloud Solutions.
  3. Njira yathu ya telegraph yokhudza kusintha kwa digito.

Source: www.habr.com

Kuwonjezera ndemanga