Debugging bash scripts เปเบกเปเบเบเปเบฒเบเบเบทเบเบฒเบเบเบญเบเบซเบฒเปเบเบฑเบกเปเบ haystack, เปเบเบเบชเบฐเปเบเบฒเบฐเปเบเปเบงเบฅเบฒเบเบตเปเบเบฒเบเปเบเบตเปเบกเปเบซเบกเปเบเบฒเบเบปเบเบขเบนเปเปเบ codebase เบเบตเปเบกเบตเบขเบนเปเปเบฅเปเบงเปเบเบเบเปเปเบกเบตเบเบฒเบเบเบดเบเบฒเบฅเบฐเบเบฒเบเบฑเบเปเบงเบฅเบฒเบเปเบฝเบงเบเบฑเบเบเบฑเบเบซเบฒเบเบญเบเปเบเบเบชเปเบฒเบ, เบเบฒเบเบเบฑเบเปเบกเปเปเบฅเบฐเบเบงเบฒเบกเบซเบเปเบฒเปเบเบทเปเบญเบเบท. เบเปเบฒเบเบชเบฒเบกเบฒเบเบเบญเบเบซเบฒเบเบปเบงเบเปเบฒเบเปเบญเบเปเบเบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบฑเปเบเบเปเบฒเบงเบเปเปเบงเปเบฒเบเบฐเปเบเบฑเบเบเปเบญเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบญเบเบเปเบฒเบเปเบญเบเบซเบผเบทเปเบเปเบงเบฅเบฒเบเบตเปเบเบฒเบเบเบธเปเบกเบเบญเบ piles เบชเบฐเบฅเบฑเบเบชเบฑเบเบเปเบญเบ.
เบเบตเบกเบเบฒเบ
เปเบเบเบปเบเบเบฝเบ, เบเบนเปเบเบฝเบเปเบเปเปเบเปเบเบเบฑเบเบชเบดเปเบเบเบตเปเบฅเบฒเบงเปเบเปเบฎเบฝเบเบฎเบนเปเปเบเบชเบญเบเบชเบฒเบกเบเบตเบเปเบฒเบเบกเบฒ, เปเบเบฑเปเบเบเบฝเบงเบเบฑเบเบเบฑเบเบเบฒเบเบเปเปเบเบดเบเบเบฒเบเบเบปเปเบงเปเบเบเบตเปเปเบฎเบฑเบเปเบซเปเบฅเบฒเบงเบซเบฅเบตเบเบฅเปเบฝเบ. เบเบตเปเปเบกเปเบเบชเบดเปเบเบชเปเบฒเบเบฑเบเปเบเบฒเบฐเบงเปเบฒเบเบนเปเบเบฑเบเบเบฐเบเบฒเบเบญเบเปเบงเบเบธเบเบเบปเบ, เปเบเบเบฒเบเบเบธเบเปเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบเบญเบเบเบงเบเปเบเบปเบฒ, เปเบฎเบฑเบเบงเบฝเบเบเบฑเบเบชเบฐเบเบดเบเปเบเบทเปเบญเบญเบฑเบเบเบฐเปเบเบกเบฑเบเบงเบฝเบเบเบฒเบเบเบปเบเบเบฐเบเบด.
เบเบฑเบเบเบฑเบเบเบฑเบ
เบชเบฐเบเบฃเบดเบ bash เบชเปเบงเบเปเบซเบเปเบเบตเปเบเปเบญเบเบเบปเบเบเปเปเปเบเบตเบเปเบเปเบเบปเบเปเบเบเบฒเบเปเบฎเบฑเบเบเบงเบฒเบกเบชเบฐเบญเบฒเบเบเบตเปเบกเบตเบเบฐเบชเบดเบเบเบดเบเบฒเบเปเบกเบทเปเบญเบกเบตเบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบเบเบตเปเบเปเปเบเบฒเบเบเบดเบเปเบเบตเบเบเบทเปเบเปเบเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบเบเบฐเบเบดเบเบฑเบ script.
เบเบงเบฒเบกเปเบเบเปเบเบชเบฒเบกเบฒเบเปเบเบตเบเบเบทเปเบเบเบฒเบเบเบฒเบเบเบญเบ, เปเบเบฑเปเบเบงเปเบฒเปเบเปเบฎเบฑเบเบชเบฑเบเบเบฒเบเบเบฒเบเปเบเบ. เบเบฒเบเบเบฑเบเบเบฒเบเบเปเบฅเบฐเบเบตเบเบฑเปเบเบเปเบฒเบงเปเบกเปเบเบกเบตเบเบงเบฒเบกเบชเปเบฒเบเบฑเบเบเบตเปเบชเบธเบเปเบเบทเปเบญเบฎเบฑเบเบเบฐเบเบฑเบเบงเปเบฒเบชเบฐเบเบดเบเบกเบตเบเบงเบฒเบกเบซเบเปเบฒเปเบเบทเปเบญเบเบทเบเบฝเบเบเปเบเบตเปเบเบฐเบเปเบฒเปเบเบตเบเบเบฒเบเปเบเบฅเบฐเบเบปเบเบเบฒเบเบเบฐเบฅเบดเบ. เบเปเบญเบเบกเบฑเบเบเบฐเปเบเปเบเบปเบงเบเบฑเบเบเบฒเบเบเบฒเบเบญเบญเบเปเบเบทเปเบญเบเบญเบเบชเบฐเปเบญเบเบเปเปเบเบฑเบเบชเบฐเบเบฒเบเบฐเบเบฒเบเปเบเบฑเปเบเบเบตเป:
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
เปเบกเปเบเบเบณเบชเบฑเปเบเบเบตเปเบชเปเบฒเบเบเบถเปเบเปเบเปเบเบฐเบเบตเปเบเปเบงเบเปเบซเปเบเปเบฒเบเบฅเบปเบเบเบฐเบเบฝเบเบเบฑเบเบเบฑเบเบเบณเบเบงเบฒเบกเบชเบฐเบญเบฒเบเบเบตเปเบเบทเบเปเบญเบตเปเบเปเบเบเปเบฅเบฐเบเบตเบกเบตเบชเบฑเบเบเบฒเบเปเบเป. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เบเบฒเบเบเบนเปเบฅเบเบดเปเบชเบเบเบงเบเปเบเปเบฎเบฑเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบฑเบ handlers เปเบเบฑเปเบ SIGINT
, เปเบเบดเปเบเปเบฎเบฑเบเปเบซเป script เบเบปเบเปเบฅเบตเบ.
เบเบญเบเบเบฒเบเบเบฑเปเบ, เปเบเบเปเบฅเบฐเบเบตเบซเบผเบฒเบเบเบตเปเบชเบธเบ, เบเปเบฒเบเบเบงเบเบเบฑเบเบเบฝเบเปเบเป EXIT
, เปเบเปเบเบงเบฒเบกเบเบดเบเปเบกเปเบเบงเปเบฒเบเบปเบงเบเบดเบเปเบฅเปเบงเบเปเบฒเบเบชเบฒเบกเบฒเบเบเบฑเบเปเบเปเบเบเบถเบเบเบดเบเปเบฒเบเบญเบ script เบชเปเบฒเบฅเบฑเบเบชเบฑเบเบเบฒเบเปเบเปเบฅเบฐเบเบปเบ.
เบเบฑเบเบเบฑเบเบเบตเปเบเปเบฒเบเบปเบเปเบงเปเปเบเบเบปเบง - เบเบฒเบเบขเบธเบเปเบเบปเบฒเปเบงเบเปเบญเบเบเบงเบฒเบกเบเบดเบเบเบฒเบ
เบกเบฑเบเปเบเบฑเบเบชเบดเปเบ เบชเบณ เบเบฑเบเบซเบผเบฒเบเบเบตเปเบเบฐเบเบญเบเบชเบฐ เปเบญเบ เบเปเปเบเบดเบเบเบฒเบเบเบฑเบเบเบตเบเบตเปเปเบเบตเบเบเบทเปเบเปเบฅเบฐเบขเบธเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบขเปเบฒเบเปเบงเบงเบฒ. เบเปเปเบกเบตเบซเบเบฑเบเบเบฐเบฎเปเบฒเบเปเบฎเบเปเบเบเบงเปเบฒเบเบฒเบเบชเบทเบเบเปเปเบเปเบฒเปเบเบตเบเบเบฒเบเบเปเบฒเบชเบฑเปเบเปเบเบฑเปเบเบเบตเป:
rm -rf ${directory_name}/*
เบเบฐเบฅเบธเบเบฒเบชเบฑเบเปเบเบเบงเปเบฒเบเบปเบงเปเบ directory_name
เบเปเปเปเบเปเบเปเบฒเบเบปเบ.
เบกเบฑเบเปเบเบฑเบเบชเบดเปเบเบชเปเบฒเบเบฑเบเบเบตเปเบเบฐเบเปเบฒเปเบเปเบซเบเปเบฒเบเบตเปเบชเปเบฒเบเปเบเปเบเบทเปเบญเบเบฑเบเบเบฒเบเบเบฑเบเบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบฑเปเบเบเปเบฒเบง set
เปเบเบฑเปเบ: set -o errexit
, set -o pipefail
เบซเบผเบท set -o nounset
เปเบเบเบญเบเบเบปเปเบเบเบญเบ script เปเบเป. เบเบฑเบเบเบฑเบเปเบซเบผเบปเปเบฒเบเบตเปเบฎเบฑเบเบเบฐเบเบฑเบเบงเปเบฒเบชเบฐเบเบดเบเบเบญเบเบเปเบฒเบเบเบฐเบญเบญเบเบเบฑเบเบเบตเบเบตเปเบกเบฑเบเบเบปเบเบเบฑเบเบฅเบฐเบซเบฑเบเบญเบญเบเบเบตเปเบเปเปเปเบกเปเบเบชเบนเบ, เบเบฒเบเบเปเบฒเปเบเปเบเบปเบงเปเบเบเบตเปเบเปเปเปเบเปเบเปเบฒเบเบปเบ, เบเปเบฒเบชเบฑเปเบเบเบตเปเบเปเปเบเบทเบเบเปเบญเบเบเปเบฒเบเบเปเป, เปเบฅเบฐเบญเบทเปเบเป:
#!/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
เบซเบกเบฒเบเปเบซเบ: เบซเบเปเบฒเบเบตเปเบชเปเบฒเบเปเบเปเบเบฑเปเบ: set -o errexit
, เบเบฐเบญเบญเบเบเบฒเบเบชเบฐเบเบดเบเบเบฑเบเบเบตเบเบตเปเบกเบตเบฅเบฐเบซเบฑเบเบเบฑเบเบเบทเบ "เบเบดเบ" (เบเบญเบเบเบฒเบเบชเบนเบ). เบเบฑเปเบเบเบฑเปเบ, เบกเบฑเบเบเบตเบเบงเปเบฒเบเบตเปเบเบฐเปเบเบฐเบเปเบฒเบเบฒเบเบเบฑเบเบเบฒเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบตเปเบเปเบฒเบซเบเบปเบเปเบญเบ, เบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบปเบเบเบปเบงเบขเปเบฒเบ:
#!/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
เบเบฒเบเบเบฝเบเบชเบฐเบเบดเบเบเปเบงเบเบงเบดเบเบตเบเบตเปเบเบฑเบเบเบฑเบเปเบซเปเบเปเบฒเบเบฅเบฐเบกเบฑเบเบฅเบฐเบงเบฑเบเบซเบผเบฒเบเบเปเบฝเบงเบเบฑเบเบเบถเบเบเบดเบเปเบฒเบเบญเบเบเปเบฒเบชเบฑเปเบเบเบฑเบเบซเบกเบปเบเปเบเบชเบฐเบเบดเบเปเบฅเบฐเบเบฒเบเบเบฐเปเบเบเบงเบฒเบกเปเบเบฑเบเปเบเปเบเปเบเบญเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเปเบญเบเบเบตเปเบกเบฑเบเบเบฐเปเบฎเบฑเบเปเบซเปเบเปเบฒเบเปเบเบเปเบ.
ShellCheck เปเบเบทเปเบญเบเบงเบเบซเบฒเบเบงเบฒเบกเบเบดเบเบเบฒเบเปเบเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบเบเบฑเบเบเบฐเบเบฒ
เบกเบฑเบเบเบธเปเบกเบเปเบฒเบเบตเปเบเบฐเบเบฐเบชเบปเบกเบเบฐเบชเบฒเบเบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบเปเบเบฑเปเบ:
เบเปเบญเบเปเบเปเบกเบฑเบเบขเบนเปเปเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบกเบเบฒเบเบเบฑเบเบเบฐเบเบฒเบเปเบญเบเบเบดเปเบเบเบญเบเบเปเบญเบเปเบเบทเปเบญเปเบญเบปเบฒเบเบปเบเบฅเบฒเบเบเบฒเบเบเปเบฝเบงเบเบฑเบ syntax, semantics, เปเบฅเบฐเบเบฒเบเบเปเปเบเบดเบเบเบฒเบเปเบเบฅเบฐเบซเบฑเบเบเบตเปเบเปเบญเบเบญเบฒเบเบเบฐเบเบฒเบเปเบเบเบฐเบเบฐเบเบตเปเบเบฑเบเบเบฐเบเบฒ. เบเบตเปเปเบกเปเบเปเบเบทเปเบญเบเบกเบทเบเบฒเบเบงเบดเปเบเบฒเบฐ static เบชเปเบฒเบฅเบฑเบ script bash เบเบญเบเบเปเบฒเบเปเบฅเบฐเบเปเบญเบเบเปเปเบเบฐเบเปเบฒเปเบซเปเปเบเปเบกเบฑเบ.
เบเบฒเบโเบเปเบฒโเปเบเปโเบฅเบฐโเบซเบฑเบโเบญเบญเบโเบเบญเบโเบเบปเบโเปเบญเบโ
เบฅเบฐเบซเบฑเบเบเบฑเบเบเบทเบเปเบ POSIX เบเปเปเบเบฝเบเปเบเปเบชเบนเบเบซเบผเบทเบซเบเบถเปเบ, เปเบเปเบเปเบฒเบชเบนเบเบซเบผเบทเบเปเปเปเบกเปเบเบชเบนเบ. เปเบเปเบเบธเบเบชเบปเบกเบเบฑเบเปเบซเบผเบปเปเบฒเบเบตเปเปเบเบทเปเบญเบชเบปเปเบเบเบทเบเบฅเบฐเบซเบฑเบเบเปเปเบเบดเบเบเบฒเบเปเบเบเบเบณเบเบปเบเปเบญเบ (เบฅเบฐเบซเบงเปเบฒเบ 201-254) เบชเปเบฒเบฅเบฑเบเบเปเบฅเบฐเบเบตเบเปเปเบเบดเบเบเบฒเบเบเปเบฒเบเป.
เบเปเปเบกเบนเบเบเบตเปเบชเบฒเบกเบฒเบเปเบเปเปเบเบเบชเบฐเบเบฃเบดเบเบญเบทเปเบเบเบตเปเบซเปเปเบเบปเบงเบเบญเบเปเบเบปเปเบฒเปเบเบทเปเบญเปเบเบปเปเบฒเปเบเบขเปเบฒเบเปเบเปเบเบญเบเบงเปเบฒเบเบฐเปเบเบเบเบญเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบตเปเปเบเบตเบเบเบถเปเบเปเบฅเบฐเบเบฐเบเบดเบเบดเบฅเบดเบเบฒเบเบฒเบกเบเบงเบฒเบกเปเบซเบกเบฒเบฐเบชเบปเบก:
#!/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
}
เบซเบกเบฒเบเปเบซเบ: เบเบฐเบฅเบธเบเบฒเบฅเบฐเบกเบฑเบเบฅเบฐเบงเบฑเบเปเบเบเบชเบฐเปเบเบฒเบฐเบเบฑเบเบเบทเปเบเบปเบงเปเบเบเบตเปเบเปเบฒเบเบเปเบฒเบเบปเบเปเบเบทเปเบญเบซเบผเบตเบเปเบงเบฑเปเบเบเบฒเบ overriding เบเบปเบงเปเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบกเปเบเบเบเบฑเบเปเบญเบตเบ.
เบเบฑเบเบเบฑเบเบเบฑเบเบเบถเบ
เบเบฒเบเบเบฑเบเปเบกเปเบเบตเปเบชเบงเบเบเบฒเบกเปเบฅเบฐเบกเบตเปเบเบเบชเปเบฒเบเปเบกเปเบเบชเปเบฒเบเบฑเบเบเบตเปเบเบฐเปเบเบปเปเบฒเปเบเบเบปเบเปเบเปเบฎเบฑเบเบเบญเบเบชเบฐเบเบดเบเบเบญเบเบเปเบฒเบเปเบเปเบขเปเบฒเบเบเปเบฒเบเบเบฒเบ. เปเบเบฑเปเบเบเบฝเบงเบเบฑเบเบเบฑเบเบเบฒเบชเบฒเบเบฒเบเบเบฝเบเปเบเบฅเปเบเบฅเบกเบฅเบฐเบเบฑเบเบชเบนเบเบญเบทเปเบเป, เบเปเบญเบเบชเบฐเปเบซเบกเบตเปเบเปเบเบฑเบเบเบฑเบเบเบฑเบเบเบถเบเบเบทเปเบเปเบกเบทเบญเบเบขเบนเปเปเบเบชเบฐเบเบดเบ bash เบเบญเบเบเปเบญเบ, เปเบเบฑเปเบ: __msg_info
, __msg_error
เปเบฅเบฐเบญเบทเปเบเป.
เบเบตเปเบเปเบงเบเบชเบฐเบซเบเบญเบเปเบเบเบชเปเบฒเบเบเบฒเบเบเบฑเบเปเบกเปเบเบตเปเปเบเปเบกเบฒเบเบเบฐเบเบฒเบเปเบเบเบเบฒเบเบเปเบฝเบเปเบเบเบขเบนเปเปเบเบชเบฐเบเบฒเบเบเบตเปเบเบฝเบง:
#!/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"
เบเปเบญเบเบกเบฑเบเบเบฐเบเบฐเบเบฒเบเบฒเบกเบกเบตเบเบปเบเปเบเบเบฒเบเบเบฐเปเบเบเบขเบนเปเปเบเบชเบฐเบเบดเบเบเบญเบเบเปเบญเบ __init
, เบเปเบญเบเบเบตเปเบเบปเบงเปเบ logger เบเบฑเปเบเบเปเบฒเบงเปเบฅเบฐเบเบปเบงเปเบเบฅเบฐเบเบปเบเบญเบทเปเบเปเปเบกเปเบเปเบฅเบตเปเบกเบเบปเปเบเบซเบผเบทเบเบฑเปเบเปเบเบฑเบเบเปเบฒเปเบฅเบตเปเบกเบเบปเปเบ. เบเบปเบงเปเบเปเบซเบผเบปเปเบฒเบเบตเปเบเบฑเบเบชเบฒเบกเบฒเบเบเบทเบเบเบฑเปเบเบเบฒเบเบเบปเบงเปเบฅเบทเบญเบเปเบเบงเบเปเบฒเบชเบฑเปเบเปเบเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบเปเบญเบตเปเบ script.
เบชเปเบฒเบฅเบฑเบเบเบปเบงเบขเปเบฒเบ, เบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบเปเบเบฑเปเบ:
$ ./run-script.sh --debug
เปเบกเบทเปเบญ script เบเบฑเปเบเบเปเบฒเบงเบเบทเบเบเบฐเบเบดเบเบฑเบ, เบกเบฑเบเบฎเบฑเบเบเบฐเบเบฑเบเบงเปเบฒเบเบฒเบเบเบฑเปเบเบเปเบฒเบเบปเปเบงเบฅเบฐเบเบปเบเบเบทเบเบเบฑเปเบเบเปเบฒเปเบเบฑเบเบเปเบฒเปเบฅเบตเปเบกเบเบปเปเบเบเปเบฒเบเบงเบเปเบเบปเบฒเบเปเบญเบเบเบฒเบ, เบซเบผเบทเบขเปเบฒเบเบซเบเปเบญเบเปเบเปเปเบฅเบตเปเบกเบเบปเปเบเบเบฑเบเบเบฒเบเบชเบดเปเบเบเบฒเบเบขเปเบฒเบเบเบตเปเปเบซเบกเบฒเบฐเบชเบปเบกเบเปเบฒเบเปเบฒเปเบเบฑเบ.
เบเปเบญเบเบกเบฑเบเบเบฐเบญเบตเบเปเบชเปเบเบฒเบเปเบฅเบทเบญเบเบเบญเบเบชเบดเปเบเบเบตเปเบเบฐเปเบฅเบตเปเบกเบเบปเปเบเปเบฅเบฐเบชเบดเปเบเบเบตเปเบเปเปเบเบงเบเปเบฎเบฑเบเปเบเบเบฒเบเบเบทเปเบเบฒเบเบฅเบฐเบซเบงเปเบฒเบเบเบฒเบเปเบเปเบเบญเบเบเบนเปเปเบเปเปเบฅเบฐเบฅเบฒเบเบฅเบฐเบญเบฝเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบเบตเปเบเบนเปเปเบเปเบชเบฒเบกเบฒเบ / เบเบงเบเปเบเบฒเบฐเปเบเบปเปเบฒเปเบเปเบ.
เบชเบฐเบเบฒเบเบฑเบเบเบฐเบเบฐเบเปเบฒเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเปเบฒเปเบเปเบเบทเบเปเบซเบกเปเปเบฅเบฐเบชเบฐเบเบฒเบเบเบญเบเบฅเบฐเบเบปเบเบเบตเปเบชเบฐเบญเบฒเบ
เบฅเบฐโเบซเบฑเบ Modular/Reusable
โโโ framework
โ โโโ common
โ โ โโโ loggers.sh
โ โ โโโ mail_reports.sh
โ โ โโโ slack_reports.sh
โ โโโ daily_database_operation.sh
เบเปเบญเบเบฎเบฑเบเบชเบฒเบเปเบญเบเปเบเบฑเบเบกเปเบฝเบเปเบเบเบเปเบฒเบเบซเบฒเบเบเบตเปเบเปเบญเบเบชเบฒเบกเบฒเบเปเบเปเปเบเบทเปเบญเปเบฅเบตเปเบกเบเบปเปเบเปเบเบเบเบฒเบเปเบซเบกเป / script bash เบเบตเปเบเปเบญเบเบเปเบญเบเบเบฒเบเบเบฑเบเบเบฐเบเบฒ. เบชเบดเปเบเปเบเบเปเปเบเบฒเบกเบเบตเปเบชเบฒเบกเบฒเบเบเปเบฒเปเบเปเบเบทเบเปเบเปเบชเบฒเบกเบฒเบเบเบทเบเปเบเบฑเบเปเบงเปเปเบ repository เปเบฅเบฐเบเบถเบเบเปเปเบกเบนเบเปเบเบเปเบเบเบเบฒเบเบญเบทเปเบเปเบเบตเปเบเปเบญเบเบเบฒเบเปเบเปเบเบฑเบเบเบฑเบเบเบฑเปเบ. เบเบฒเบเบเบฑเบเบเบฑเปเบเปเบเบเบเบฒเบเบเปเบงเบเบงเบดเบเบตเบเบตเปเบซเบผเบธเบเบฅเบปเบเบขเปเบฒเบเบซเบผเบงเบเบซเบผเบฒเบเบเบญเบเบเบฐเบซเบเบฒเบเบเบญเบเบชเบฐเบเบดเบเบญเบทเปเบเปเปเบฅเบฐเบเบฑเบเบฎเบฑเบเบเบฐเบเบฑเบเบงเปเบฒเบเบฒเบเบฅเบฐเบซเบฑเบเบกเบตเบเบฐเบซเบเบฒเบเบเปเบญเบเปเบฅเบฐเบเปเบฒเบเบเปเปเบเบฒเบเบเบปเบเบชเบญเบ.
เปเบเบฑเปเบเบเบฝเบงเบเบฑเบเบเบปเบงเบขเปเบฒเบเบเปเบฒเบเปเบเบดเบ, เบซเบเปเบฒเบเบตเปเบเบฑเบเบเบถเบเบเบฑเบเบซเบกเบปเบเปเบเบฑเปเบ: __msg_info
, __msg_error
เปเบฅเบฐเบญเบทเปเบเป, เปเบเบฑเปเบ: เบเบปเบเบฅเบฒเบเบเบฒเบ Slack, เปเบเปเบเบทเบเบเบฑเบเบเบธเปเบเบเบเปเบฒเบเบซเบฒเบเบขเบนเปเปเบ common/*
เปเบฅเบฐเปเบเบทเปเบญเบกเบเปเปเปเบเบเปเบเบทเปเบญเบเปเบซเบงเปเบเบชเบฐเบเบฒเบเบฐเบเบฒเบเบญเบทเปเบเปเปเบเบฑเปเบ daily_database_operation.sh
.
เบญเบญเบเบเบฒเบเบฅเบฐเบเบปเบเบเบตเปเบชเบฐเบญเบฒเบ
เบเปเบฒเบเปเบฒเบเบเปเบฒเบฅเบฑเบเปเบซเบฅเบเบเบฑเบเบเบฐเบเบฒเบเบญเบเปเบเปเปเบเบเบฐเบเบฐเบเบตเปเบชเบฐเบเบดเบเบเปเบฒเบฅเบฑเบเปเบฎเบฑเบเบงเบฝเบ, เบกเบฑเบเปเบเบฐเบเปเบฒเปเบซเปเปเบเบฑเบเบเปเปเบกเบนเบเบเบฑเปเบเบเปเบฒเบงเบเบฑเบเบซเบกเบปเบเปเบเปเบเปเบฅเบเบฐเบเปเบฅเบตเบเบตเปเปเบเปเบฎเปเบงเบกเบเบฑเบเบเบตเปเบกเบตเบเบทเปเปเบเบเบชเบธเปเบก, เปเบเบฑเปเบ:. /tmp/AlRhYbD97/*
. เบเปเบฒเบเบชเบฒเบกเบฒเบเปเบเปเบเบปเบงเบชเปเบฒเบเบเปเปเบเบงเบฒเบกเปเบเบเบชเบธเปเบกเปเบเบทเปเบญเปเบฅเบทเบญเบเบเบทเปเปเบเปเบฅเบเบฐเบเปเบฅเบต:
rand_dir_name="$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 1)"
เบซเบผเบฑเบเบเบฒเบเบชเปเบฒเปเบฅเบฑเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบ, เบเบฒเบเปเบฎเบฑเบเบเบงเบฒเบกเบชเบฐเบญเบฒเบเบเบญเบเปเบเปเบฅเบเบฐเบเปเบฅเบตเบเบฑเปเบเบเปเบฒเบงเบชเบฒเบกเบฒเบเบชเบฐเบซเบเบญเบเปเบซเปเบขเบนเปเปเบเบเบปเบงเบเบฑเบ hook เบเบตเปเบชเบปเบเบเบฐเบเบฒเบเปเบฒเบเปเบเบดเบ. เบเปเบฒเปเบเปเบฅเบเบฐเบเปเบฅเบตเบเบปเปเบงเบเบฒเบงเบเปเปเปเบเปเบฎเบฑเบเบเบฒเบเปเบเบดเปเบเปเบเบ, เบเบงเบเบกเบฑเบเบชเบฐเบชเบปเบกเปเบฅเบฐเปเบเบเบฒเบเบเบฑเปเบเบเบญเบเปเบฎเบฑเบเปเบซเปเปเบเบตเบเบเบฑเบเบซเบฒเบเบตเปเบเปเปเบเบฒเบเบเบดเบเปเบเปเบเบปเปเบฒเบเบฒเบ, เปเบเบฑเปเบ: เปเบเปเบเปเบเบฑเบก.
เบเบฒเบเปเบเปเปเบเบฅเปเบฅเบฑเบญเบ
เปเบฅเบทเปเบญเบเปเบเปเบฒเบเบเปเบญเบเบเบฒเบเปเบซเปเปเบเปเปเบเบงเปเบฒเบเบฝเบเปเบเปเบซเบเบถเปเบเบเบปเบงเบขเปเบฒเบเบเบญเบเบชเบฐเบเบดเบเปเบกเปเบเปเบฅเปเบเบขเบนเปเปเบเปเบฎเบเปเบเปเบงเบฅเบฒเปเบเบเปเปเบเบฒเบก. เบเบตเปเบชเบฒเบกเบฒเบเปเบฎเบฑเบเปเบเปเปเบเบเปเบเปเปเบเบฅเปเบฅเบฑเบญเบ.
เบเปเบญเบเบกเบฑเบเบเบฐเบชเปเบฒเบเปเบเบฅเป lock เปเบ /tmp/project_name/*.lock
เปเบฅเบฐเบเบงเบเปเบเบดเปเบเบเบฒเบเบเบฐเบเบปเบเบเบปเบงเบเบญเบเบเบงเบเปเบเบปเบฒเปเบเบเบญเบเบเบปเปเบเบเบญเบเบชเบฐเบเบฃเบดเบ. เบญเบฑเบเบเบตเปเบเปเบงเบเปเบซเปเบชเบฐเบเบฃเบดเบเบชเบดเปเบเบชเบธเบเบขเปเบฒเบเบชเบฐเบซเบเปเบฒเบเบฒเบก เปเบฅเบฐเบซเบผเบตเบเปเบงเบฑเปเบเบเบฒเบเบเปเบฝเบเปเบเบเบเบตเปเบเปเปเบเบฒเบเบเบดเบเบเปเปเบเบฑเบเบชเบฐเบเบฒเบเบฐเบเบญเบเบฅเบฐเบเบปเบเปเบเบเบชเบฐเบเบฃเบดเบเบญเบทเปเบเบเบตเปเปเบฎเบฑเบเบงเบฝเบเบเบฐเปเบฒเบเบเบฑเบ. เปเบเบฅเปเบฅเบฑเบญเบเบเปเปเบเปเบฒเปเบเบฑเบเบเปเบฒเบเปเบฒเบเบเปเบญเบเบเบฒเบ script เบเบฝเบงเบเบฑเบเปเบเบทเปเบญเบเปเบฒเปเบเบตเบเบเบฒเบเบเบฐเบซเบเบฒเบเปเบเปเบฎเบเบเบตเปเบเปเบฒเบเบปเบเปเบงเป.
เบงเบฑเบเปเบเบเปเบฅเบฐเบเบฑเบเบเบธเบ
เบเบงเบเปเบฎเบปเบฒเบกเบฑเบเบเบฐเบเปเบญเบเปเบฎเบฑเบเบงเบฝเบเบเบฑเบ scripts เบเบตเปเปเบเปเปเบเปเบฅเบเบฐเบเบฒเบง, เปเบเบฑเปเบ: เบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบญเบเบเบฒเบเบเปเปเบกเบนเบเบเบฐเบเปเบฒเบงเบฑเบ. เบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบฑเปเบเบเปเบฒเบงเปเบเบเบเบปเบเบเบฐเบเบดเบเบฐเบเบญเบเบเปเบงเบเบฅเปเบฒเบเบฑเบเบเบญเบเบเบฑเปเบเบเบญเบ: เบเบฒเบเปเบซเบผเบเบเปเปเบกเบนเบ, เบเบฒเบเบเบงเบเบชเบญเบเบเบงเบฒเบกเบเบดเบเบเบปเบเบเบฐเบเบด, เบเบฒเบเบเปเบฒเปเบเบปเปเบฒเบเปเปเบกเบนเบ, เบเบฒเบเบชเบปเปเบเบฅเบฒเบเบเบฒเบเบชเบฐเบเบฒเบเบฐเบเบฒเบ, เปเบฅเบฐเบญเบทเปเบเป.
เปเบเบเปเบฅเบฐเบเบตเบเบฑเปเบเบเปเบฒเบง, เบเปเบฒเบเบฐเปเบเบปเปเบฒเบชเบฐเปเบซเบกเบตเบเบฐเบเบฒเบเบฒเบกเบเปเบฒเบฅเบฒเบเบชเบฐเบเบดเบเปเบเบฑเบเบชเบฐเบเบดเบเบเบฐเบซเบเบฒเบเบเปเบญเบเปเบเบเบเปเบฒเบเบซเบฒเบเปเบฅเบฐเบฅเบฒเบเบเบฒเบเบชเบฐเบเบฒเบเบฐเปเบฅเบฐเปเบงเบฅเบฒเบเบฐเบเบดเบเบฑเบเบเบญเบเปเบเบปเบฒเปเบเบปเปเบฒเปเบเบเปเบเป:
time source "${filepath}" "${args}">> "${LOG_DIR}/RUN_LOG" 2>&1
เบเปเปเบกเบฒเบเปเบญเบเบชเบฒเบกเบฒเบเปเบซเบฑเบเปเบงเบฅเบฒเบเบฐเบเบดเบเบฑเบเบเปเบงเบ:
tac "${LOG_DIR}/RUN_LOG.txt" | grep -m1 "real"
เบเบตเปเบเปเบงเบเปเบซเปเบเปเบญเบเบฅเบฐเบเบธเบเบฑเบเบซเบฒ / เบเบทเปเบเบเบตเปเบเปเบฒเปเบเบชเบฐเบเบดเบเบเบตเปเบเปเบญเบเบเบฒเบเบเบฒเบเปเบเบตเปเบกเบเบฐเบชเบดเบเบเบดเบเบฒเบ.
เปเบเบเบเบต!
เบกเบตเบซเบเบฑเบเบญเบตเบเปเบเปเบเบตเปเบเบฐเบญเปเบฒเบ:
เปเบเปเบฅเบฐเบเบฒเบเบเบงเบฒเบกเบเปเบฒ GPU. เบเบปเบงเบขเปเบฒเบเบเบญเบเปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบเบเบตเปเบเบฑเบเปเบเบทเปเบญเบเบเปเบงเบเปเบซเบเบเบฒเบเปเบเบเบญเบตเบเปเบชเป webhooks เปเบเบเบฒเบเปเบเบฑเบเบฎเบฑเบเบชเบฒเบงเบฑเบเบเบธ S3 เบเบญเบ Mail.ru Cloud Solutions. เบเปเบญเบเบเบฒเบเปเบเบฅเบฐเปเบฅเบเบเบญเบเบเบงเบเปเบฎเบปเบฒเบเปเบฝเบงเบเบฑเบเบเบฒเบเบซเบฑเบเปเบเบฑเบเบเบดเบเบดเบเบญเบ.
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com