Mafi kyawun Halayen Rubutun Bash: Jagora Mai Sauri zuwa Amintattun Rubutun Bash da Aiki

Mafi kyawun Halayen Rubutun Bash: Jagora Mai Sauri zuwa Amintattun Rubutun Bash da Aiki
Fuskar bangon waya ta manapi

Gyara rubutun bash yana kama da neman allura a cikin hay, musamman lokacin da sabbin abubuwan ƙari suka bayyana a cikin faifan lambar da ke akwai ba tare da la'akari da kan lokaci ba game da batutuwan tsari, shiga da aminci. Kuna iya samun kanku a cikin irin waɗannan yanayi ko dai saboda kurakuran ku ko kuma lokacin sarrafa tarin rubutun.

tawagar Mail.ru Cloud Solutions fassara labarin tare da shawarwarin da zasu taimaka muku rubutawa, gyarawa da kula da rubutunku mafi kyau. Ku yi imani da shi ko a'a, babu wani abu da ya doke gamsuwar rubutu mai tsabta, lambar bash mai shirye-da-amfani da ke aiki kowane lokaci.

A cikin labarin, marubucin ya ba da labarin abubuwan da ya koya a cikin ’yan shekarun da suka gabata, da kuma wasu kura-kurai na yau da kullun da suka ɗauke shi a hankali. Wannan yana da mahimmanci saboda kowane mai haɓaka software, a wani lokaci a cikin aikin su, yana aiki tare da rubutun don sarrafa ayyukan aiki na yau da kullun.

Masu tarko

Yawancin rubutun bash da na ci karo da su ba sa amfani da ingantacciyar hanyar tsaftacewa lokacin da wani abu da ba tsammani ya faru yayin aiwatar da rubutun.

Abin mamaki na iya tasowa daga waje, kamar karɓar sigina daga ainihin. Gudanar da irin waɗannan lokuta yana da matukar mahimmanci don tabbatar da cewa rubutun ya dogara da isa don aiki akan tsarin samarwa. Sau da yawa ina amfani da masu sarrafa fita don amsa al'amura kamar haka:

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 Ginin ginin harsashi ne wanda ke taimaka maka yin rijistar aikin tsaftacewa wanda ake kira idan akwai sigina. Duk da haka, ya kamata a kula da masu kulawa na musamman kamar SIGINT, wanda ke sa rubutun ya zubar da ciki.

Bugu da kari, a mafi yawan lokuta ya kamata ku kama kawai EXIT, amma ra'ayin shi ne cewa za ku iya zahiri keɓance halayen rubutun ga kowane siginar ɗaya.

Ayyukan saitin da aka gina a ciki - saurin ƙarewa akan kuskure

Yana da matukar muhimmanci a mayar da martani ga kurakurai da zarar sun faru kuma a dakatar da aiwatarwa da sauri. Babu wani abu da zai fi muni kamar ci gaba da gudanar da umarni kamar haka:

rm -rf ${directory_name}/*

Da fatan za a lura cewa mai canzawa directory_name ba a ƙaddara ba.

Yana da mahimmanci a yi amfani da ginanniyar ayyuka don ɗaukar irin waɗannan al'amuran setkamar set -o errexit, set -o pipefail ko set -o nounset a farkon rubutun. Waɗannan ayyukan suna tabbatar da cewa rubutun ku zai fita da zaran ya ci karo da kowace lambar fita mara sifili, amfani da mabambantan da ba a bayyana ba, umarnin da ba daidai ba ya wuce kan bututu, da sauransu:

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

Note: ginanniyar ayyuka kamar set -o errexit, zai fita daga rubutun da zarar an sami lambar dawo da "raw" (ban da sifili). Don haka yana da kyau a gabatar da sarrafa kuskuren al'ada, misali:

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

Rubutun rubutun ta wannan hanya yana tilasta ka ka mai da hankali game da halayen duk umarnin da ke cikin rubutun kuma ka yi tsammanin yiwuwar kuskure kafin ya ba ka mamaki.

ShellCheck don gano kurakurai yayin haɓakawa

Yana da daraja haɗa wani abu kamar Shell Check cikin ci gaban ku da gwada bututun don bincika lambar bash ɗin ku akan mafi kyawun ayyuka.

Ina amfani da shi a cikin mahalli na ci gaba na gida don samun rahotanni akan syntax, semantics, da wasu kurakurai a cikin lambar da ƙila na rasa yayin haɓakawa. Wannan kayan aikin bincike ne a tsaye don rubutun bash ɗinku kuma ina ba da shawarar amfani da shi sosai.

Yin amfani da lambobin fita na ku

Lambobin dawowa a POSIX ba sifili bane ko ɗaya ba, amma sifili ko ƙimar mara sifili. Yi amfani da waɗannan fasalulluka don dawo da lambobin kuskure na al'ada (tsakanin 201-254) don lokuta daban-daban na kuskure.

Ana iya amfani da wannan bayanin ta wasu rubutun da ke nannade naku don fahimtar ainihin nau'in kuskuren da ya faru kuma ya amsa daidai:

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

Note: da fatan za a yi taka-tsan-tsan da mabambantan sunaye da kuke ayyana don gujewa wuce gona da iri da gangan.

Ayyukan shiga

Kyawawan jeji da tsari yana da mahimmanci don sauƙin fahimtar sakamakon rubutun ku. Kamar yadda yake da sauran manyan yarukan shirye-shirye, koyaushe ina amfani da ayyukan shiga na asali a cikin rubutun bash na, kamar su. __msg_info, __msg_error da sauransu.

Wannan yana taimakawa samar da daidaitaccen tsarin shiga ta hanyar yin canje-canje a wuri ɗaya kawai:

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

Yawancin lokaci ina ƙoƙarin samun wani nau'in tsari a cikin rubutuna __init, Inda aka fara fara irin waɗannan masu canjin logger da sauran masu canjin tsarin ko saita su zuwa ƙima. Hakanan ana iya saita waɗannan masu canji daga zaɓuɓɓukan layin umarni yayin kiran rubutun.

Misali, wani abu kamar:

$ ./run-script.sh --debug

Lokacin da aka aiwatar da irin wannan rubutun, yana tabbatar da cewa an saita saitunan tsarin gabaɗaya zuwa ƙimar tsoho idan ana buƙatar su, ko kuma aƙalla fara zuwa wani abu da ya dace idan ya cancanta.

Yawancin lokaci ina yin zaɓin abin da za a fara da abin da ba za a yi ba a kan cinikin ciniki tsakanin mai amfani da mai amfani da cikakkun bayanai na saitunan da mai amfani zai iya / ya kamata ya shiga ciki.

Gine-gine don sake amfani da tsaftataccen tsarin tsarin

Modular/kodi mai sake amfani da shi

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

Ina adana keɓaɓɓen wurin ajiya wanda zan iya amfani da shi don fara sabon aikin / rubutun bash wanda nake son haɓakawa. Duk wani abu da za a iya sake amfani da shi za a iya adana shi a cikin ma'ajiyar ajiya kuma a dawo da shi ta wasu ayyukan da ke son amfani da wannan aikin. Shirya ayyuka ta wannan hanya yana rage girman sauran rubutun kuma yana tabbatar da cewa tushen lambar yana ƙarami kuma mai sauƙin gwadawa.

Kamar yadda yake a cikin misalin da ke sama, duk ayyukan shiga kamar __msg_info, __msg_error da sauransu, kamar rahotannin Slack, suna ƙunshe daban a ciki common/* da kuma haɗa kai tsaye a cikin wasu yanayi kamar daily_database_operation.sh.

Bar bayan tsari mai tsabta

Idan kuna loda duk wani albarkatu yayin da rubutun ke gudana, ana ba da shawarar adana duk waɗannan bayanai a cikin kundin adireshi da aka raba tare da sunan bazuwar, misali. /tmp/AlRhYbD97/*. Kuna iya amfani da janareta na rubutu don zaɓar sunan directory:

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

Bayan kammala aikin, ana iya ba da tsaftace irin waɗannan kundayen adireshi a cikin ƙugiya da aka tattauna a sama. Idan ba a kula da kundayen adireshi na wucin gadi ba, suna tarawa kuma a wani mataki na haifar da matsalolin da ba zato ba tsammani akan mai watsa shiri, kamar cikakken diski.

Amfani da fayilolin kulle

Yawancin lokaci kuna buƙatar tabbatar da cewa misali ɗaya ne kawai na rubutun ke gudana akan mai watsa shiri a kowane lokaci. Ana iya yin wannan ta amfani da fayilolin kulle.

Yawancin lokaci ina ƙirƙirar fayilolin kulle a ciki /tmp/project_name/*.lock kuma duba kasancewar su a farkon rubutun. Wannan yana taimakawa rubutun ya ƙare da kyau da kuma guje wa canje-canjen da ba zato ba tsammani ga tsarin tsarin ta wani rubutun da ke gudana a layi daya. Ba a buƙatar fayilolin kulle idan kuna buƙatar aiwatar da rubutun iri ɗaya a layi daya akan mai masaukin baki.

Auna kuma inganta

Sau da yawa muna buƙatar yin aiki tare da rubutun da ke gudana na dogon lokaci, kamar ayyukan bayanan yau da kullun. Irin waɗannan ayyuka yawanci sun ƙunshi jerin matakai: loda bayanai, bincika abubuwan da ba su da kyau, shigo da bayanai, aika rahotannin matsayi, da sauransu.

A irin waɗannan lokuta, koyaushe ina ƙoƙarin karya rubutun zuwa ƙananan rubutun daban kuma in ba da rahoton matsayinsu da lokacin aiwatar da su ta amfani da:

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

Daga baya zan iya ganin lokacin aiwatarwa tare da:

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

Wannan yana taimaka mani gano matsala/ wurare masu sannu a hankali a cikin rubutun da ke buƙatar ingantawa.

Good luck!

Me kuma za a karanta:

  1. Tafi da caches GPU.
  2. Misalin aikace-aikacen da aka kora akan abubuwan da suka danganci yanar gizo a cikin ma'ajin S3 na Mail.ru Cloud Solutions.
  3. Tashar mu ta telegram game da canjin dijital.

source: www.habr.com

Add a comment