เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡ Bash Script: เบ„เบนเปˆเบกเบทเบ”เปˆเบงเบ™เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบซเบ™เป‰เบฒเป€เบŠเบทเปˆเบญเบ–เบทเปเบฅเบฐเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” Bash Scripts

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡ Bash Script: เบ„เบนเปˆเบกเบทเบ”เปˆเบงเบ™เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบซเบ™เป‰เบฒเป€เบŠเบทเปˆเบญเบ–เบทเปเบฅเบฐเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” Bash Scripts
เบฎเบนเบšเบงเปเป€เบ›เป€เบ›เบต Shell เป‚เบ”เบ manapi

Debugging bash scripts เปเบกเปˆเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฒเบ™เบŠเบญเบเบซเบฒเป€เบ‚เบฑเบกเปƒเบ™ haystack, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เป€เบžเบตเปˆเบกเปƒเบซเบกเปˆเบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ™ codebase เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบงเป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบ—เบฑเบ™เป€เบงเบฅเบฒเบเปˆเบฝเบงเบเบฑเบšเบšเบฑเบ™เบซเบฒเบ‚เบญเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡, เบเบฒเบ™เบ•เบฑเบ”เป„เบกเป‰เปเบฅเบฐเบ„เบงเบฒเบกเบซเบ™เป‰เบฒเป€เบŠเบทเปˆเบญเบ–เบท. เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบŠเบญเบเบซเบฒเบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเบšเปเปˆเบงเปˆเบฒเบˆเบฐเป€เบ›เบฑเบ™เบเป‰เบญเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡เบซเบผเบทเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบฒเบ™เบ„เบธเป‰เบกเบ„เบญเบ‡ piles เบชเบฐเบฅเบฑเบšเบชเบฑเบšเบŠเป‰เบญเบ™.

เบ—เบตเบกเบ‡เบฒเบ™ Mail.ru Cloud Solutions เปเบ›เบšเบปเบ”เบ„เบงเบฒเบกเบ—เบตเปˆเบกเบตเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบตเปˆเบˆเบฐเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบ‚เบฝเบ™, เปเบเป‰เบšเบฑเบ™เบซเบฒ เปเบฅเบฐเบฎเบฑเบเบชเบฒเบชเบฐเบ„เบฃเบดเบšเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป„เบ”เป‰เบ”เบตเบ‚เบถเป‰เบ™. เป€เบŠเบทเปˆเบญเบซเบผเบทเบšเปเปˆ, เบšเปเปˆเบกเบตเบซเบเบฑเบ‡เป€เบเบตเบ™เบ„เบงเบฒเบกเบžเปเปƒเบˆเบ‚เบญเบ‡เบเบฒเบ™เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ” bash เบ—เบตเปˆเบชเบฐเบญเบฒเบ”, เบžเป‰เบญเบกเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰เป„เบ”เป‰เบ—เบธเบเบ„เบฑเป‰เบ‡.

เปƒเบ™เบšเบปเบ”เบ‚เบฝเบ™, เบœเบนเป‰เบ‚เบฝเบ™เป„เบ”เป‰เปเบšเปˆเบ‡เบ›เบฑเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบฅเบฒเบงเป„เบ”เป‰เบฎเบฝเบ™เบฎเบนเป‰เปƒเบ™เบชเบญเบ‡เบชเบฒเบกเบ›เบตเบœเปˆเบฒเบ™เบกเบฒ, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบšเบฒเบ‡เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”เบ—เบปเปˆเบงเป„เบ›เบ—เบตเปˆเป€เบฎเบฑเบ”เปƒเบซเป‰เบฅเบฒเบงเบซเบฅเบตเบเบฅเป‰เบฝเบ‡. เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เป€เบžเบฒเบฐเบงเปˆเบฒเบœเบนเป‰เบžเบฑเบ”เบ—เบฐเบ™เบฒเบŠเบญเบšเปเบงเบ—เบธเบเบ„เบปเบ™, เปƒเบ™เบšเบฒเบ‡เบˆเบธเบ”เปƒเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ, เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบชเบฐเบ„เบดเบšเป€เบžเบทเปˆเบญเบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”เบงเบฝเบเบ‡เบฒเบ™เบ›เบปเบเบเบฐเบ•เบด.

เบˆเบฑเบšเบเบฑเบšเบ”เบฑเบ

เบชเบฐเบ„เบฃเบดเบš 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 เป€เบžเบทเปˆเบญเบเบงเบ”เบซเบฒเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒ

เบกเบฑเบ™เบ„เบธเป‰เบกเบ„เปˆเบฒเบ—เบตเปˆเบˆเบฐเบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™: เบเบงเบ” Shell เป€เบ‚เบปเป‰เบฒเปƒเบ™เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเปเบฅเบฐเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ—เปเปˆเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบžเบทเปˆเบญเบเบงเบ”เป€เบšเบดเปˆเบ‡เบฅเบฐเบซเบฑเบ” bash เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ•เปเปˆเบเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”.

เบ‚เป‰เบญเบเปƒเบŠเป‰เบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเป€เบžเบทเปˆเบญเป€เบญเบปเบฒเบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบเปˆเบฝเบงเบเบฑเบš 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"

เบ™เบตเป‰เบŠเปˆเบงเบเปƒเบซเป‰เบ‚เป‰เบญเบเบฅเบฐเบšเบธเบšเบฑเบ™เบซเบฒ / เบžเบทเป‰เบ™เบ—เบตเปˆเบŠเป‰เบฒเปƒเบ™เบชเบฐเบ„เบดเบšเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš.

เป‚เบŠเบเบ”เบต!

เบกเบตเบซเบเบฑเบ‡เบญเบตเบเปเบ”เปˆเบ—เบตเปˆเบˆเบฐเบญเปˆเบฒเบ™:

  1. เป„เบ›เปเบฅเบฐเบ–เบฒเบ™เบ„เบงเบฒเบกเบˆเปเบฒ GPU.
  2. เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบตเปˆเบ‚เบฑเบšเป€เบ„เบทเปˆเบญเบ™เบ”เป‰เบงเบเป€เบซเบ”เบเบฒเบ™เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ webhooks เปƒเบ™เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบงเบฑเบ”เบ–เบธ S3 เบ‚เบญเบ‡ Mail.ru Cloud Solutions.
  3. เบŠเปˆเบญเบ‡เบ—เบฒเบ‡เป‚เบ—เบฅเบฐเป€เบฅเบเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบซเบฑเบ™เป€เบ›เบฑเบ™เบ”เบดเบˆเบดเบ•เบญเบ™.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™