Bash Scripting Best Practicing: He Aratohu Tere mo te Whakapono me te Mahinga Panui Panui

Bash Scripting Best Practicing: He Aratohu Tere mo te Whakapono me te Mahinga Panui Panui
Anga pepapātū by manapi

Ko te patuiro i nga tuhinga bash he rite ki te rapu ngira i roto i te tarutaru, ina koa ka puta nga taapiri hou i roto i te turanga waehere o naianei me te kore e whai whakaaro ki nga take o te hanganga, te takiuru me te pono. Ka taea e koe te kite i a koe ano i roto i nga ahuatanga penei na o koe ake he, i te wa e whakahaere ana koe i nga puranga o nga tuhinga.

rōpū Mail.ru Cloud Solutions i whakamaoritia he tuhinga me nga taunakitanga hei awhina i a koe ki te tuhi, ki te patuiro me te pupuri pai ake i o tuhinga. Te ti'aturi, kaore ranei, kaore he mea e pa ana ki te pai o te tuhi i nga waehere bash ma, kua rite ki te whakamahi i nga wa katoa.

I roto i te tuhinga, ka tohatohahia e te kaituhi nga mea i akohia e ia i roto i nga tau kua pahure ake nei, me etahi o nga hapa noa i mau i a ia. He mea nui tenei na te mea ko ia kaiwhakawhanake rorohiko, i etahi wa i a raatau mahi, ka mahi me nga tuhinga tuhi hei whakaaunoa i nga mahi mahi.

Nga kaikawe mahanga

Ko te nuinga o nga tuhinga bash kua tutakina e au kaore rawa e whakamahi i tetahi tikanga horoi pai ina pa mai tetahi mea ohorere i te wa e mahia ana te tuhinga.

Ka puta ake nga ohorere mai i waho, penei i te whiwhi tohu mai i te matua. Ko te whakahaere i enei keehi he mea tino nui ki te whakarite kia pono nga tuhinga ki te whakahaere i runga i nga punaha whakaputa. He maha nga wa ka whakamahia e au nga kaihautu puta ki te whakautu ki nga ahuatanga penei:

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 he anga i hanga-i roto i te whakahau hei awhina i a koe ki te rehita i tetahi mahi horoi ka kiia mena he tohu. Heoi, me tino tupato ki nga kaihautu penei SIGINT, ka mutu te tuhi.

I tua atu, i te nuinga o nga wa me hopu noa koe EXIT, engari ko te whakaaro ka taea e koe te whakarite i te whanonga o te tuhinga mo ia tohu takitahi.

Nga mahi huinga-i roto - ka mutu tere i runga i te hapa

He mea nui ki te whakautu i nga hapa i te wa ka puta mai ka mutu te mahi. Kaore he mea kino atu i te haere tonu ki te whakahaere whakahau penei:

rm -rf ${directory_name}/*

Kia mahara ko te taurangi directory_name kaore i whakatauhia.

He mea nui ki te whakamahi i nga mahi hanga-i roto hei hapai i aua ahuatanga setpērā i set -o errexit, set -o pipefail ranei set -o nounset i te timatanga o te tuhinga. Ko enei mahi ka whakarite kia puta to tuhinga ina tutaki ki tetahi waehere putanga kore-kore, te whakamahi i nga taurangi kaore i tautuhia, nga whakahau muhu i tukuna i runga i te paipa, me era atu:

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

Tuhipoka: hanga-i roto i nga mahi penei i set -o errexit, ka puta i te tuhinga ka puta he waehere whakahoki "raw" (i tua atu i te kore). Na reira he pai ake te whakauru i te whakahaere hapa ritenga, hei tauira:

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

Ma te tuhi tuhinga penei ka kaha koe ki te noho tupato ki te whanonga o nga whakahau katoa i roto i te tuhinga me te matapae ka puta he hapa i mua i te ohorere.

ShellCheck kia kitea nga hapa i te wa o te whanaketanga

He pai te whakauru i tetahi mea penei Raukura ki roto i to whanaketanga me te whakamatautau paipa ki te tirotiro i to waehere bash ki nga mahi pai.

Ka whakamahia e au i roto i aku taiao whakawhanaketanga o te rohe ki te tiki purongo mo te wetereo, nga kupu kupu, me etahi hapa i roto i te waehere kua ngaro pea au i te wa e whanake ana. He taputapu tātari pateko tenei mo o tuhinga bash ka tino taunaki ahau kia whakamahia.

Ma te whakamahi i o ake waehere putanga

Ko nga waehere whakahoki i roto i te POSIX ehara i te kore noa, kotahi ranei, engari he kore, he uara kore-kore ranei. Whakamahia enei ahuatanga ki te whakahoki i nga waehere hapa ritenga (i waenganui i te 201-254) mo nga momo take hapa.

Ka taea te whakamahi i enei korero e etahi atu tuhinga e takai ana i a koe kia mohio ai koe he aha te momo hapa i puta me te whakautu i runga ano:

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

Tuhipoka: Tena koa kia tupato ki nga ingoa taurangi ka tautuhia e koe kia kore ai e pokanoa i nga taurangi taiao.

Nga mahi takiuru

He mea nui te takiuru ataahua me te hanganga kia ngawari ki te mohio ki nga hua o to tuhinga. Pērā ki ērā atu reo whakahōtaka taumata-tiketike, ka whakamahi tonu ahau i nga mahi takiuru taketake i roto i aku tuhinga bash, penei __msg_info, __msg_error a na runga i.

Ka awhina tenei ki te whakarato i te hanganga takiuru paerewa ma te whakarereke i te waahi kotahi anake:

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

I te nuinga o te wa ka ngana ahau ki te whakauru i etahi momo miihini ki roto i aku tuhinga __init, i reira ka arawhitihia, ka tautuhia ranei ki nga uara taunoa nga taurangi logger me etahi atu taurangi punaha. Ka taea hoki te whakarite i enei taurangi mai i nga whiringa raina whakahau i te wa o te tono tuhinga.

Hei tauira, penei:

$ ./run-script.sh --debug

I te wa e mahia ana he tuhi tuhi, ka whakarite kia tautuhia nga tautuhinga-whanui ki nga uara taunoa mena ka hiahiatia, ka tiimata ranei ki tetahi mea e tika ana mena e tika ana.

I te nuinga o te wa ka whakatauhia e au he aha te mea hei arawhiti me te aha e kore e mahia i runga i te tauhokohoko i waenga i te atanga kaiwhakamahi me nga taipitopito o nga whirihoranga ka taea e te kaiwhakamahi te ruku.

Te hoahoanga mo te whakamahi ano me te ahua o te punaha ma

Waehere Modular/Reusable

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

Kei te pupuri ahau i tetahi putunga motuhake ka taea e au te whakamahi ki te arawhiti i tetahi kaupapa hou / tuhinga bash e hiahia ana ahau ki te whakawhanake. Ko nga mea katoa ka taea te whakamahi ano ka taea te penapena ki roto i te putunga ka tikina mai e etahi atu kaupapa e hiahia ana ki te whakamahi i taua mahi. Ko te whakarite kaupapa i tenei huarahi ka tino whakaitihia te rahi o etahi atu tuhinga me te whakarite hoki he iti te turanga waehere me te ngawari ki te whakamatautau.

Pērā i te tauira i runga ake nei, ko ngā mahi takiuru katoa pēnei i te __msg_info, __msg_error me etahi atu, penei i nga purongo a Slack, kei roto motuhake common/* me te hono hihiri ki etahi atu ahuatanga penei daily_database_operation.sh.

Waiho he punaha ma

Mena kei te utaina e koe etahi rauemi i te wa e rere ana te tuhinga, e taunaki ana kia penapenahia enei raraunga katoa ki roto i te raarangi tiritahi me te ingoa matapōkere, hei tauira. /tmp/AlRhYbD97/*. Ka taea e koe te whakamahi i nga kaihanga tuhinga matapōkere hei kowhiri i te ingoa whaiaronga:

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

I muri i te otinga o nga mahi, ka taea te horoi o nga raarangi korero i roto i nga kaikawe matau kua korerohia i runga ake nei. Ki te kore e tiakina nga raarangi rangitahi, ka whakaemihia, katahi ka puta he raru ohorere ki te kaihautu, penei i te kopae katoa.

Te whakamahi i nga konae maukati

I te nuinga o nga wa ka hiahia koe ki te whakarite kia kotahi anake te tauira o te tuhinga e rere ana i runga i te kaihautu i nga wa katoa. Ka taea tenei ma te whakamahi i nga konae raka.

I te nuinga o te wa ka hangaia e au nga konae raka ki roto /tmp/project_name/*.lock me te tirotiro mo to ratau aroaro i te timatanga o te tuhinga. Ka awhina tenei ki te whakamutu i te tuhinga me te karo i nga huringa ohorere ki te ahuatanga o te punaha na tetahi atu tuhinga e rere whakarara ana. Kaore e hiahiatia nga konae maukati mena ka hiahia koe kia rite te tuhinga ki te mahi whakarara ki runga i tetahi kaihautu.

Te ine me te whakapai ake

I te nuinga o te wa me mahi tahi tatou me nga tuhinga e rere ana mo nga wa roa, penei i nga mahi o ia ra. Ko enei mahinga he raupapa o nga hikoinga: te uta i nga raraunga, te tirotiro mo nga mea rereke, te kawemai i nga raraunga, te tuku ripoata mana, me era atu.

I roto i enei ahuatanga, ka ngana tonu ahau ki te wawahi i te tuhinga ki roto i nga tuhinga iti motuhake me te whakaatu i to raatau mana me te wa mahi ma te whakamahi:

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

I muri mai ka kite ahau i te wa mahi me:

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

Ma tenei ka awhina ahau ki te tautuhi i nga waahi raruraru / puhoi i roto i nga tuhinga e hiahia ana kia arotau.

Ngā manaakitanga pai!

He aha atu hei panui:

  1. Haere me nga keteroki GPU.
  2. He tauira o te tono-a-takahanga i runga i nga matapae tukutuku i te rokiroki ahanoa S3 o Mail.ru Cloud Solutions.
  3. To tatou hongere waea mo te huringa matihiko.

Source: will.com

Tāpiri i te kōrero