ProHoster > Pūnaewele > Nā Administration > ʻ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
ʻ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
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:
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.