ʻO nā hoʻomaʻamaʻa maikaʻi loa ʻo Bash Scripting: He alakaʻi wikiwiki i nā palapala Bash hilinaʻi a me ka hana

ʻO nā hoʻomaʻamaʻa maikaʻi loa ʻo Bash Scripting: He alakaʻi wikiwiki i nā palapala Bash hilinaʻi a me ka hana
Pepa kiʻi paʻi na ka manapi

ʻO ka debugging bash scripts e like me ka ʻimi ʻana i kahi nila i loko o kahi mauʻu, ʻoiai ke ʻike ʻia nā hoʻohui hou i ka codebase i kēia manawa me ka ʻole o ka noʻonoʻo ʻana i nā pilikia o ka hoʻolālā, logging a me ka hilinaʻi. Hiki iā ʻoe ke loaʻa iā ʻoe iho i loko o ia mau kūlana ma muli o kāu mau hewa ponoʻī a i ʻole ke hoʻokele ʻana i nā puʻu paʻakikī o nā palapala.

hui Mail.ru Cloud Solutions unuhi ʻatikala me nā manaʻo e kōkua iā ʻoe e kākau, debug a mālama maikaʻi i kāu mau palapala. E manaʻoʻiʻo a ʻaʻole paha, ʻaʻohe mea e ʻoi aku ka maikaʻi o ke kākau ʻana i ka code bash maʻemaʻe a mākaukau e hoʻohana i kēlā me kēia manawa.

Ma ka ʻatikala, haʻi ka mea kākau i kāna mea i aʻo ai i nā makahiki i hala iho nei, a me kekahi mau hewa maʻamau i hoʻopaʻa ʻia iā ia. He mea koʻikoʻi kēia no ka mea, hana kēlā me kēia mea hoʻomohala polokalamu, i kekahi manawa o kā lākou ʻoihana, me nā palapala e hoʻokaʻawale i nā hana hana maʻamau.

Nā mea mālama pahele

ʻO ka hapa nui o nā palapala bash aʻu i ʻike ai ʻaʻole hoʻohana i kahi mīkini hoʻomaʻemaʻe maikaʻi inā loaʻa kahi mea i manaʻo ʻole ʻia i ka wā o ka hoʻokō ʻana i ka palapala.

Hiki ke kahaha mai waho, e like me ka loaʻa ʻana o kahi hōʻailona mai ke kumu. He mea koʻikoʻi ka lawelawe ʻana i ia mau hihia e hōʻoia i ka hilinaʻi o nā palapala e holo ai ma nā ʻōnaehana hana. Hoʻohana pinepine au i nā mea hoʻopuka puka e pane i nā hiʻohiʻona e like me kēia:

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 kauoha i kūkulu ʻia i loko o ka pūpū e kōkua iā ʻoe e hoʻopaʻa inoa i kahi hana hoʻomaʻemaʻe i kapa ʻia inā loaʻa nā hōʻailona. Eia naʻe, pono e mālama pono me nā mea lawelawe e like me SIGINT, ka mea e hoopau ai i ka palapala.

Eia hou, i ka hapanui o nā hihia pono ʻoe e hopu wale EXIT, akā ʻo ka manaʻo hiki iā ʻoe ke hoʻonohonoho pono i ke ʻano o ka palapala no kēlā me kēia hōʻailona.

Nā hana hoʻonohonoho i kūkulu ʻia - hoʻopau wikiwiki i ka hewa

He mea nui ka pane ʻana i nā hewa i ka wā e kū mai ai a hoʻopau koke i ka hoʻokō. ʻAʻohe mea i ʻoi aku ka maikaʻi ma mua o ka hoʻomau ʻana i kahi kauoha e like me kēia:

rm -rf ${directory_name}/*

E ʻoluʻolu e hoʻomaopopo i ka loli directory_name ʻaʻole i hoʻoholo ʻia.

He mea nui ka hoʻohana ʻana i nā hana i kūkulu ʻia no ka mālama ʻana i ia mau hiʻohiʻona sete like me set -o errexit, set -o pipefail ai ole ia, set -o nounset i ka hoomaka ana o ka palapala. ʻO kēia mau hana e hōʻoia i ka puka ʻana o kāu palapala i ka wā e hālāwai ai me kahi code exit non-zero, ka hoʻohana ʻana i nā ʻano like ʻole, nā kauoha kūpono ʻole i kau ʻia ma luna o kahi paipu, a pēlā aku:

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

'Ōlelo Aʻo: nā hana i kūkulu ʻia e like me set -o errexit, e haʻalele i ka palapala i ka wā e loaʻa ai kahi code hoʻihoʻi "raw" (ma waho aʻe o ka zero). No laila ʻoi aku ka maikaʻi o ka hoʻokomo ʻana i ka hoʻoponopono hewa maʻamau, no ka laʻana:

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

ʻO ke kākau ʻana i nā palapala ma kēia ʻano e koi ai iā ʻoe e makaʻala loa i ka ʻano o nā kauoha āpau i ka palapala a me ka manaʻo i ka hiki ʻana mai o kahi hewa ma mua o ka haʻohaʻo ʻana iā ʻoe.

ShellCheck e ʻike i nā hewa i ka wā hoʻomohala

Pono e hoʻohui i kekahi mea like Kaopuiki i kāu hoʻomohala ʻana a me ka hoʻāʻo ʻana i nā pipeline e nānā i kāu code bash e kūʻē i nā hana maikaʻi loa.

Hoʻohana au iā ia i loko o kaʻu wahi hoʻomohala kūloko e kiʻi i nā hōʻike e pili ana i ka syntax, semantics, a me kekahi mau hewa i ke code aʻu i nalo ai i ka wā e ulu ana. He mea hana loiloi static kēia no kāu mau palapala bash a makemake nui wau e hoʻohana.

Ke hoʻohana nei i kāu mau code puka ponoʻī

ʻAʻole ʻole a i ʻole hoʻokahi wale nō nā code hoʻihoʻi ma POSIX, akā ʻaʻole a i ʻole ka waiwai ʻole. E hoʻohana i kēia mau hiʻohiʻona e hoʻihoʻi i nā code hewa maʻamau (ma waena o 201-254) no nā hihia hewa like ʻole.

Hiki ke hoʻohana ʻia kēia ʻike e nā palapala ʻē aʻe e kāʻei iā ʻoe e hoʻomaopopo pono i ke ʻano o ka hewa i hana ʻia a pane ʻia e like me:

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

'Ōlelo Aʻo: e ʻoluʻolu e makaʻala loa i nā inoa hoʻololi āu e wehewehe ai i mea e pale aku ai i nā ʻano hoʻololi kaiapuni.

Nā hana logging

He mea nui ka logging nani a hoʻonohonoho ʻia e hoʻomaopopo maʻalahi i nā hopena o kāu palapala. E like me nā ʻōlelo papahana kiʻekiʻe, hoʻohana mau wau i nā hana logging maoli i kaʻu mau palapala bash, e like me __msg_info, __msg_error a no laila, ma luna o.

Kōkua kēia i ka hāʻawi ʻana i kahi hoʻolālā logging maʻamau ma o ka hoʻololi ʻana ma kahi hoʻokahi wale nō:

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

Ho'āʻo pinepine wau e loaʻa kekahi ʻano mīkini i kaʻu mau palapala __init, kahi i hoʻomaka mua ʻia ai ʻole hoʻonohonoho ʻia nā mea hoʻololi logger a me nā ʻōnaehana ʻē aʻe i nā waiwai paʻamau. Hiki ke hoʻonohonoho ʻia kēia mau ʻano hoʻololi mai nā koho laina kauoha i ka wā e kāhea ana i ka palapala.

No ka laʻana, he mea like:

$ ./run-script.sh --debug

Ke hoʻokō ʻia kēlā ʻano palapala, e hōʻoia i ka hoʻonohonoho ʻana o nā ʻōnaehana ākea i nā waiwai paʻamau inā koi ʻia lākou, a i ʻole i hoʻomaka ʻia i kahi mea kūpono inā pono.

Hoʻokumu pinepine au i ka koho o ka mea e hoʻomaka ai a me ka mea ʻaʻole e hana ma ke kālepa-off ma waena o ka mea hoʻohana a me nā kikoʻī o nā hoʻonohonoho e hiki ai i ka mea hoʻohana ke komo i loko.

Hoʻolālā no ka hoʻohana hou ʻana a me ke kūlana ʻōnaehana maʻemaʻe

Code modular/hoohana hou

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

Mālama wau i kahi waihona ʻokoʻa e hiki iaʻu ke hoʻohana e hoʻomaka i kahi papahana / bash script hou aʻu e makemake ai e hoʻomohala. Hiki ke mālama ʻia kekahi mea i hiki ke hoʻohana hou ʻia i loko o kahi waihona a hoʻihoʻi ʻia e nā papahana ʻē aʻe e makemake ana e hoʻohana i kēlā hana. ʻO ka hoʻonohonoho ʻana i nā papahana ma kēia ʻano e hōʻemi nui i ka nui o nā palapala ʻē aʻe a hōʻoia pū i ka liʻiliʻi o ke kumu code a maʻalahi hoʻi e hoʻāʻo.

E like me ka laʻana ma luna, nā hana logging āpau e like me __msg_info, __msg_error a me nā mea ʻē aʻe, e like me nā hōʻike Slack, aia i loko o kahi kaʻawale common/* a hoʻohui ikaika i nā hiʻohiʻona ʻē aʻe e like me daily_database_operation.sh.

E waiho ma hope o kahi ʻōnaehana maʻemaʻe

Inā ʻoe e hoʻouka ana i nā kumuwaiwai i ka wā e holo ana ka palapala, pono ʻoe e mālama i nā ʻikepili āpau i loko o kahi papa kuhikuhi me ka inoa maʻamau, e.g. /tmp/AlRhYbD97/*. Hiki iā ʻoe ke hoʻohana i nā mea hana kikokikona e koho i ka inoa papa kuhikuhi:

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

Ma hope o ka pau ʻana o ka hana, hiki ke hoʻolako ʻia ka hoʻomaʻemaʻe ʻana o ia mau papa kuhikuhi i loko o nā mea hoʻokele makau i kūkākūkā ʻia ma luna. Inā ʻaʻole mālama ʻia nā papa kuhikuhi manawaleʻa, hōʻiliʻili lākou a i kekahi manawa ke kumu i nā pilikia i manaʻo ʻole ʻia ma ka mea hoʻokipa, e like me kahi disk piha.

Ke hoʻohana nei i nā faila laka

Pono ʻoe e hōʻoia i hoʻokahi wale nō manawa o kahi palapala e holo ana ma luna o kahi host i kēlā me kēia manawa. Hiki ke hana i kēia me ka hoʻohana ʻana i nā faila laka.

Hana mau au i nā faila laka i loko /tmp/project_name/*.lock a nānā i ko lākou hele ʻana ma ka hoʻomaka ʻana o ka palapala. Kōkua kēia i ka hoʻopau maikaʻi ʻana o ka palapala a pale i nā loli i manaʻo ʻole ʻia i ke kūlana ʻōnaehana e kekahi palapala e holo like ana. ʻAʻole pono nā faila laka inā makemake ʻoe i ka palapala like e hoʻokō like ʻia ma kahi host i hāʻawi ʻia.

E ana a hoʻomaikaʻi

Pono mākou e hana me nā palapala e holo ana i nā manawa lōʻihi, e like me nā hana ʻikepili i kēlā me kēia lā. Hoʻopili maʻamau ia mau hana i kahi kaʻina o nā ʻanuʻu: hoʻouka ʻana i ka ʻikepili, nānā i nā anomalies, lawe mai i ka ʻikepili, hoʻouna i nā hōʻike kūlana, a pēlā aku.

I kēlā mau hihia, hoʻāʻo mau wau e uhaʻi i ka palapala i nā palapala liʻiliʻi liʻiliʻi a hōʻike i ko lākou kūlana a me ka manawa hoʻokō me ka hoʻohana ʻana:

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

Ma hope hiki iaʻu ke ʻike i ka manawa hoʻokō me:

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

Kōkua kēia iaʻu e ʻike i nā wahi pilikia / lohi i nā palapala e pono ai ka loiloi.

Pomaikai!

He aha hou aʻe e heluhelu ai:

  1. E hele a me nā huna huna GPU.
  2. ʻO kahi laʻana o kahi noi hoʻokele hanana e pili ana i nā webhooks i ka waihona S3 mea mālama o Mail.ru Cloud Solutions.
  3. ʻO kā mākou pūnaewele telegram e pili ana i ka hoʻololi kikohoʻe.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka