Bash Scripting Cov Kev Ua Zoo Tshaj Plaws: Phau Ntawv Qhia Ceev kom ntseeg tau thiab ua tau zoo Bash Scripts

Bash Scripting Cov Kev Ua Zoo Tshaj Plaws: Phau Ntawv Qhia Ceev kom ntseeg tau thiab ua tau zoo Bash Scripts
Plhaub wallpaper los ntawm manapi

Debugging bash scripts yog zoo li nrhiav ib rab koob nyob rau hauv ib lub haystack, tshwj xeeb tshaj yog thaum cov tshiab ntxiv tshwm nyob rau hauv cov codebase uas twb muaj lawm yam tsis muaj sij hawm xav txog cov teeb meem ntawm cov qauv, txiav thiab kev ntseeg tau. Koj tuaj yeem pom koj tus kheej nyob rau hauv cov xwm txheej zoo li no vim yog koj tus kheej yuam kev lossis thaum tswj cov kab ntawv nyuaj.

pab neeg Mail.ru Huab Solutions txhais ib tsab xov xwm nrog cov lus pom zoo uas yuav pab koj sau, kho thiab tswj koj cov ntawv sau zoo dua. Ntseeg nws los tsis, tsis muaj dab tsi ua rau kev txaus siab ntawm kev sau ntawv huv, npaj-rau-siv bash code uas ua haujlwm txhua lub sijhawm.

Hauv tsab xov xwm, tus sau qhia txog qhov nws tau kawm dhau los ob peb xyoos dhau los, nrog rau qee qhov kev ua yuam kev uas tau ntes nws tawm ntawm kev saib xyuas. Qhov no yog qhov tseem ceeb vim tias txhua tus tsim tawm software, ntawm qee lub sijhawm hauv lawv txoj haujlwm, ua haujlwm nrog cov ntawv sau los ua haujlwm ua haujlwm niaj hnub ua haujlwm.

Trap handlers

Feem ntau bash scripts kuv tau ntsib yeej tsis siv lub tshuab ntxuav kom zoo thaum muaj ib yam dab tsi tshwm sim thaum lub sijhawm ua tiav tsab ntawv.

Kev xav tsis thoob tuaj yeem tshwm sim los ntawm sab nraud, xws li tau txais lub teeb liab los ntawm lub hauv paus. Kev tuav cov xwm txheej zoo li no tseem ceeb heev kom ntseeg tau tias cov ntawv sau muaj kev ntseeg siab txaus los khiav ntawm cov tshuab tsim khoom. Kuv feem ntau siv cov neeg tawm tswv yim los teb rau cov xwm txheej zoo li no:

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 yog lub plhaub tsim-hauv cov lus txib uas pab koj sau npe ua haujlwm huv uas raug hu thaum muaj teeb meem. Txawm li cas los xij, yuav tsum tau saib xyuas tshwj xeeb nrog cov neeg tuav xws li SIGINT, uas ua rau tsab ntawv rho tawm.

Tsis tas li ntawd, nyob rau hauv feem ntau koj yuav tsum tsuas ntes EXIT, tab sis lub tswv yim yog tias koj tuaj yeem hloov kho tus cwj pwm ntawm tsab ntawv rau txhua tus neeg lub teeb liab.

Built-in teeb ua haujlwm - nrawm nrawm ntawm qhov yuam kev

Nws yog ib qho tseem ceeb heev uas yuav tau teb rau qhov ua yuam kev sai li sai tau thaum lawv tshwm sim thiab nres kev ua tiav sai. Tsis muaj ib yam dab tsi yuav phem tshaj qhov txuas ntxiv mus ua haujlwm zoo li no:

rm -rf ${directory_name}/*

Thov nco ntsoov tias qhov sib txawv directory_name tsis tau txiav txim.

Nws yog ib qho tseem ceeb uas yuav tau siv built-in functions los daws cov xwm txheej zoo li no setxws li set -o errexit, set -o pipefail los yog set -o nounset thaum pib ntawm tsab ntawv. Cov haujlwm no xyuas kom meej tias koj tsab ntawv yuav tawm sai li sai tau thaum nws ntsib ib qho kev tawm tsis yog xoom, siv cov kev hloov pauv uas tsis tau teev tseg, cov lus txib tsis raug hla lub yeeb nkab, thiab lwm yam:

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

Nco ntsoov: built-in functions xws li set -o errexit, yuav tawm ntawm tsab ntawv sai li sai tau thaum muaj "raws" code rov qab (tsis yog xoom). Yog li nws yog qhov zoo dua los qhia txog kev ua yuam kev tuav, piv txwv li:

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

Kev sau ntawv li no yuam kom koj ceev faj ntxiv txog tus cwj pwm ntawm txhua cov lus txib hauv tsab ntawv thiab cia siab tias yuav muaj qhov yuam kev ua ntej nws yuav ua rau koj xav tsis thoob.

ShellCheck txhawm rau txheeb xyuas qhov yuam kev thaum lub sijhawm txhim kho

Nws yog tsim nyog integrating ib yam dab tsi zoo li ShellCheck rau hauv koj txoj kev loj hlob thiab kev sim cov kav dej los xyuas koj cov bash code tiv thaiv kev coj ua zoo tshaj.

Kuv siv nws hauv kuv qhov kev loj hlob ib puag ncig kom tau txais cov lus ceeb toom ntawm syntax, semantics, thiab qee qhov yuam kev hauv cov cai uas kuv yuav tau plam thaum txhim kho. Qhov no yog cov cuab yeej ntsuas zoo li qub rau koj cov ntawv sau bash thiab kuv xav kom siv nws.

Siv koj tus kheej cov lej tawm

Cov lej xa rov qab hauv POSIX tsis yog xoom lossis ib qho, tab sis xoom lossis tsis yog xoom tus nqi. Siv cov yam ntxwv no los xa cov lej yuam kev (nruab nrab ntawm 201-254) rau ntau yam yuam kev.

Cov ntaub ntawv no tuaj yeem siv los ntawm lwm cov ntawv sau uas qhwv koj li kom nkag siab meej yam kev ua yuam kev tshwm sim thiab ua raws li:

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

Nco ntsoov: thov ceev faj tshwj xeeb nrog cov npe sib txawv uas koj txhais tau kom tsis txhob yuam kev dhau ntawm ib puag ncig hloov pauv.

Kev kaw haujlwm ua haujlwm

Kev nkag siab zoo nkauj thiab tsim qauv yog qhov tseem ceeb kom nkag siab yooj yim cov txiaj ntsig ntawm koj tsab ntawv. Raws li nrog rau lwm yam lus programming qib siab, kuv ib txwm siv cov ntawv sau ua haujlwm hauv kuv cov ntawv bash, xws li __msg_info, __msg_error thiab thiaj li nyob.

Qhov no pab muab cov txheej txheem kev txiav txim siab los ntawm kev hloov pauv hauv ib qho chaw:

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

Kuv feem ntau sim kom muaj qee yam ntawm cov txheej txheem hauv kuv cov ntawv sau __init, qhov twg xws li logger variables thiab lwm yam system variables yog pib los yog teem rau default values. Cov kev hloov pauv no tseem tuaj yeem raug teeb tsa los ntawm cov kab lus hais kom ua thaum lub sijhawm sau ntawv.

Piv txwv li, ib yam dab tsi zoo li:

$ ./run-script.sh --debug

Thaum cov ntawv zoo li no raug ua tiav, nws ua kom ntseeg tau tias qhov kev teeb tsa thoob plaws qhov system tau teeb tsa rau qhov tseem ceeb yog tias lawv xav tau, lossis tsawg kawg pib ua rau qee yam tsim nyog yog tias tsim nyog.

Kuv feem ntau pib qhov kev xaiv ntawm dab tsi yuav pib thiab dab tsi tsis ua ntawm kev lag luam tawm ntawm tus neeg siv interface thiab cov ntsiab lus ntawm cov teeb tsa uas tus neeg siv tuaj yeem / yuav tsum tau nkag mus rau hauv.

Architecture rau rov siv dua thiab huv lub xeev

Modular/reusable code

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

Kuv khaws ib lub repository cais uas kuv tuaj yeem siv los pib qhov project tshiab / bash tsab ntawv uas kuv xav tsim. Txhua yam uas tuaj yeem rov qab siv tau tuaj yeem muab khaws cia rau hauv qhov chaw cia khoom thiab rov qab los ntawm lwm cov haujlwm uas xav siv qhov haujlwm ntawd. Kev teeb tsa cov phiaj xwm txoj kev no txo ​​qis qhov loj ntawm lwm cov ntawv sau thiab ua kom ntseeg tau tias cov cai hauv paus me me thiab yooj yim rau kev sim.

Raws li nyob rau hauv cov piv txwv saum toj no, tag nrho cov loging functions xws li __msg_info, __msg_error thiab lwm yam, xws li Slack tsab ntawv ceeb toom, muaj cais nyob rau hauv common/* thiab dynamically txuas rau lwm yam scenarios zoo li daily_database_operation.sh.

Tawm hauv qab ib qho kev huv huv

Yog tias koj tab tom thauj khoom ib qho kev pab cuam thaum tsab ntawv tab tom khiav, nws raug nquahu kom khaws tag nrho cov ntaub ntawv zoo li no hauv cov npe sib koom nrog lub npe random, piv txwv li. /tmp/AlRhYbD97/*. Koj tuaj yeem siv random text generators los xaiv cov npe ntawm cov npe:

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

Tom qab ua tiav kev ua haujlwm, kev ntxuav cov ntawv teev npe zoo li no tuaj yeem muab rau hauv cov khoom sib txuas uas tau tham saum toj no. Yog tias cov ntawv teev npe ib ntus tsis tau saib xyuas, lawv sib sau ua ke thiab ntawm qee theem ua rau muaj teeb meem npaj txhij txog ntawm tus tswv tsev, xws li tag nrho disk.

Siv cov ntaub ntawv xauv

Feem ntau koj yuav tsum xyuas kom meej tias tsuas yog ib qho piv txwv ntawm tsab ntawv tau khiav ntawm tus tswv tsev ntawm lub sijhawm twg los tau. Qhov no tuaj yeem ua tiav siv cov ntaub ntawv xauv.

Kuv feem ntau tsim cov ntaub ntawv xauv hauv /tmp/project_name/*.lock thiab xyuas seb lawv muaj nyob rau thaum pib ntawm tsab ntawv. Qhov no pab cov ntawv xaus zoo nkauj thiab zam kev hloov pauv yam tsis tau xav txog rau lub xeev lub xeev los ntawm lwm tsab ntawv ua haujlwm sib luag. Xauv cov ntaub ntawv tsis xav tau yog tias koj xav tau tib tsab ntawv yuav tsum tau ua nyob rau hauv parallel ntawm tus tswv tsev.

Ntsuas thiab txhim kho

Peb feem ntau yuav tsum tau ua haujlwm nrog cov ntawv sau ua haujlwm ntev ntev, xws li kev ua haujlwm niaj hnub. Cov haujlwm zoo li no feem ntau suav nrog cov theem ntawm cov kauj ruam: thauj cov ntaub ntawv, tshuaj xyuas qhov tsis txaus ntseeg, xa cov ntaub ntawv xa mus, xa cov ntaub ntawv qhia txog xwm txheej, thiab lwm yam.

Hauv cov xwm txheej zoo li no, kuv ib txwm sim ua txhaum tsab ntawv rau hauv cov ntawv me me thiab tshaj tawm lawv cov xwm txheej thiab sijhawm ua tiav siv:

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

Tom qab ntawd kuv tuaj yeem pom lub sijhawm ua tiav nrog:

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

Qhov no pab kuv txheeb xyuas qhov teeb meem / qeeb hauv cov ntawv sau uas xav tau kev ua kom zoo.

Hmoov zoo!

Yuav nyeem dab tsi ntxiv:

  1. Mus thiab GPU caches.
  2. Ib qho piv txwv ntawm daim ntawv thov kev tshwm sim-tsav raws li webhooks hauv S3 khoom cia ntawm Mail.ru Huab Solutions.
  3. Peb telegram channel hais txog kev hloov pauv digital.

Tau qhov twg los: www.hab.com

Ntxiv ib saib