เชฌเซ‡เชถ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ€เช‚เช— เชถเซเชฐเซ‡เชทเซเช  เชชเซเชฐเซ‡เช•เซเชŸเชฟเชธ: เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เช…เชจเซ‡ เชชเซเชฐเชฆเชฐเซเชถเชจ เชฌเซ‡เชถ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซเชธ เชฎเชพเชŸเซ‡ เชเชกเชชเซ€ เชฎเชพเชฐเซเช—เชฆเชฐเซเชถเชฟเช•เชพ

เชฌเซ‡เชถ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ€เช‚เช— เชถเซเชฐเซ‡เชทเซเช  เชชเซเชฐเซ‡เช•เซเชŸเชฟเชธ: เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เช…เชจเซ‡ เชชเซเชฐเชฆเชฐเซเชถเชจ เชฌเซ‡เชถ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซเชธ เชฎเชพเชŸเซ‡ เชเชกเชชเซ€ เชฎเชพเชฐเซเช—เชฆเชฐเซเชถเชฟเช•เชพ
เชฎเชจเชพเชชเซ€ เชฆเซเชตเชพเชฐเชพ เชถเซ‡เชฒ เชตเซ‰เชฒเชชเซ‡เชชเชฐ

เชฌเซ‡เชถ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‡ เชกเซ€เชฌเช— เช•เชฐเชตเซเช‚ เช เช˜เชพเชธเชจเซ€ เช—เช‚เชœเซ€เชฎเชพเช‚เชฅเซ€ เชธเซ‹เชฏ เชถเซ‹เชงเชตเชพ เชœเซ‡เชตเซเช‚ เช›เซ‡, เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชฌเช‚เชงเชพเชฐเชฃ, เชฒเซ‹เช—เซ€เช‚เช— เช…เชจเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏเชคเชพเชจเชพ เชฎเซเชฆเซเชฆเชพเช“เชจเซ‡ เชธเชฎเชฏเชธเชฐ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ€เชงเชพ เชตเชฟเชจเชพ เชนเชพเชฒเชจเชพ เช•เซ‹เชกเชฌเซ‡เชเชฎเชพเช‚ เชจเชตเชพ เช‰เชฎเซ‡เชฐเชพเช“ เชฆเซ‡เช–เชพเชฏ เช›เซ‡. เชคเชฎเซ‡ เชคเชฎเชพเชฐเซ€ เชชเซ‹เชคเชพเชจเซ€ เชญเซ‚เชฒเซ‹เชจเซ‡ เชฒเซ€เชงเซ‡ เช…เชฅเชตเชพ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเชพ เชœเชŸเชฟเชฒ เชขเช—เชฒเชพเชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช†เชตเซ€ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเช“เชฎเชพเช‚ เชคเชฎเชพเชฐเซ€ เชœเชพเชคเชจเซ‡ เชถเซ‹เชงเซ€ เชถเช•เซ‹ เช›เซ‹.

เชŸเซ€เชฎ Mail.ru เช•เซเชฒเชพเช‰เชก เชธเซ‹เชฒเซเชฏเซเชถเชจเซเชธ เชญเชฒเชพเชฎเชฃเซ‹ เชธเชพเชฅเซ‡เชจเชพ เชฒเซ‡เช–เชจเซ‹ เช…เชจเซเชตเชพเชฆ เช•เชฐเซเชฏเซ‹ เช›เซ‡ เชœเซ‡ เชคเชฎเชจเซ‡ เชคเชฎเชพเชฐเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‡ เชตเชงเซ เชธเชพเชฐเซ€ เชฐเซ€เชคเซ‡ เชฒเช–เชตเชพ, เชกเชฟเชฌเช— เช•เชฐเชตเชพ เช…เชจเซ‡ เชœเชพเชณเชตเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเชถเซ‡. เชฎเชพเชจเซ‹ เช•เซ‡ เชจเชพ เชฎเชพเชจเซ‹, เชธเซเชตเชšเซเช›, เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพ เชฎเชพเชŸเซ‡ เชคเซˆเชฏเชพเชฐ เชฌเซ‡เชถ เช•เซ‹เชก เชœเซ‡ เชฆเชฐ เชตเช–เชคเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชฒเช–เชตเชพเชจเชพ เชธเช‚เชคเซ‹เชทเชจเซ‡ เช•เช‚เชˆเชชเชฃ เชนเชฐเชพเชตเซ€ เชถเช•เชคเซเช‚ เชจเชฅเซ€.

เชฒเซ‡เช–เชฎเชพเช‚, เชฒเซ‡เช–เช• เช›เซ‡เชฒเซเชฒเชพ เช•เซ‡เชŸเชฒเชพเช• เชตเชฐเซเชทเซ‹เชฎเชพเช‚ เชคเซ‡เชฃเซ‡ เชœเซ‡ เชถเซ€เช–เซเชฏเชพ เช›เซ‡ เชคเซ‡ เชถเซ‡เชฐ เช•เชฐเซ‡ เช›เซ‡, เชคเซ‡เชฎเชœ เช•เซ‡เชŸเชฒเซ€เช• เชธเชพเชฎเชพเชจเซเชฏ เชญเซ‚เชฒเซ‹ เช•เซ‡ เชœเซ‡เชฃเซ‡ เชคเซ‡เชจเซ‡ เชฐเช•เซเชทเช•เชฅเซ€ เชฆเซ‚เชฐ เชฐเชพเช–เซเชฏเซ‹ เช›เซ‡. เช† เช…เช—เชคเซเชฏเชจเซเช‚ เช›เซ‡ เช•เชพเชฐเชฃ เช•เซ‡ เชฆเชฐเซ‡เช• เชธเซ‹เชซเซเชŸเชตเซ‡เชฐ เชกเซ‡เชตเชฒเชชเชฐ, เชคเซ‡เชฎเชจเซ€ เช•เชพเชฐเช•เชฟเชฐเซเชฆเซ€เชจเชพ เช…เชฎเซเช• เชคเชฌเช•เซเช•เซ‡, เชจเชฟเชฏเชฎเชฟเชค เช•เชพเชฐเซเชฏ เช•เชพเชฐเซเชฏเซ‹เชจเซ‡ เชธเซเชตเชšเชพเชฒเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡.

เชŸเซเชฐเซ‡เชช เชนเซ‡เชจเซเชกเชฒเชฐเซเชธ

เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชเช•เซเชเซ‡เช•เซเชฏเซเชถเชจ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชœเซเชฏเชพเชฐเซ‡ เช•เช‚เช‡เช• เช…เชฃเชงเชพเชฐเซเชฏเซเช‚ เชฌเชจเซ‡ เช›เซ‡ เชคเซเชฏเชพเชฐเซ‡ เชฎเซ‡เช‚ เช…เชจเซเชญเชตเซ‡เชฒเซ€ เชฎเซ‹เชŸเชพเชญเชพเช—เชจเซ€ เชฌเซ‡เชถ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹ เช•เซเชฏเชพเชฐเซ‡เชฏ เช…เชธเชฐเช•เชพเชฐเช• เช•เซเชฒเชฟเชจเช…เชช เชฎเชฟเช•เซ‡เชจเชฟเชเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเซ€ เชจเชฅเซ€.

เชฌเชนเชพเชฐเชฅเซ€ เช†เชถเซเชšเชฐเซเชฏ เชชเซ‡เชฆเชพ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ เช•เซ‹เชฐเชฎเชพเช‚เชฅเซ€ เชธเชฟเช—เซเชจเชฒ เชฎเซ‡เชณเชตเชตเซเช‚. เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹ เชชเซเชฐเซ‹เชกเช•เซเชถเชจ เชธเชฟเชธเซเชŸเชฎเซเชธ เชชเชฐ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชชเซ‚เชฐเชคเซ€ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เช›เซ‡ เชคเซ‡เชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช†เชตเชพ เช•เซ‡เชธเซ‹เชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เชฐเชตเซเช‚ เช…เชคเซเชฏเช‚เชค เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เช›เซ‡. เชนเซเช‚ เชตเชพเชฐเช‚เชตเชพเชฐ เช†เชจเชพ เชœเซ‡เชตเชพ เชฆเซƒเชถเซเชฏเซ‹เชจเซ‹ เชœเชตเชพเชฌ เช†เชชเชตเชพ เชฎเชพเชŸเซ‡ เชเช•เซเชเชฟเชŸ เชนเซ‡เชจเซเชกเชฒเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเช‚ เช›เซเช‚:

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 เชถเซ‡เชฒ เชฌเชฟเชฒเซเชŸ-เช‡เชจ เช•เชฎเชพเชจเซเชก เช›เซ‡ เชœเซ‡ เชคเชฎเชจเซ‡ เช•เซเชฒเซ€เชจเช…เชช เชซเช‚เช•เซเชถเชจ เชฐเชœเซ€เชธเซเชŸเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡เชจเซ‡ เช•เซ‹เชˆเชชเชฃ เชธเชฟเช—เซเชจเชฒเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เชฌเซ‹เชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชœเซ‹ เช•เซ‡, เชœเซ‡เชฎ เช•เซ‡ เชนเซ‡เชจเซเชกเชฒเชฐเซเชธ เชธเชพเชฅเซ‡ เช–เชพเชธ เช•เชพเชณเชœเซ€ เชฒเซ‡เชตเซ€ เชœเซ‹เชˆเช SIGINT, เชœเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‡ เชฌเช‚เชง เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เช•เชพเชฐเชฃ เชฌเชจเซ‡ เช›เซ‡.

เชตเชงเซเชฎเชพเช‚, เชฎเซ‹เชŸเชพเชญเชพเช—เชจเชพ เช•เชฟเชธเซเชธเชพเช“เชฎเชพเช‚ เชคเชฎเชพเชฐเซ‡ เชซเช•เซเชค เชชเช•เชกเชตเซเช‚ เชœเซ‹เชˆเช EXIT, เชชเชฐเช‚เชคเซ เชตเชฟเชšเชพเชฐ เช เช›เซ‡ เช•เซ‡ เชคเชฎเซ‡ เชฆเชฐเซ‡เช• เชตเซเชฏเช•เซเชคเชฟเช—เชค เชธเช‚เช•เซ‡เชค เชฎเชพเชŸเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเชพ เชตเชฐเซเชคเชจเชจเซ‡ เชตเชพเชธเซเชคเชตเชฎเชพเช‚ เช•เชธเซเชŸเชฎเชพเช‡เช เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹.

เชฌเชฟเชฒเซเชŸ-เช‡เชจ เชธเซ‡เชŸ เชซเช‚เช•เซเชถเชจเซเชธ - เชญเซ‚เชฒ เชชเชฐ เชเชกเชชเซ€ เชธเชฎเชพเชชเซเชคเชฟ

เชญเซ‚เชฒเซ‹ เชฅเชพเชฏ เช•เซ‡ เชคเชฐเชค เชœ เชคเซ‡เชจเซ‹ เชชเซเชฐเชคเชฟเชธเชพเชฆ เช†เชชเชตเซ‹ เช…เชจเซ‡ เชเชกเชชเชฅเซ€ เช…เชฎเชฒ เช•เชฐเชตเชพเชจเซเช‚ เชฌเช‚เชง เช•เชฐเชตเซเช‚ เช–เซ‚เชฌ เชœ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เช›เซ‡. เช†เชจเชพ เชœเซ‡เชตเชพ เช†เชฆเซ‡เชถ เชšเชฒเชพเชตเชตเชพเชจเซเช‚ เชšเชพเชฒเซ เชฐเชพเช–เชตเชพ เช•เชฐเชคเชพเช‚ เช•เช‚เชˆ เช–เชฐเชพเชฌ เชนเซ‹เชˆ เชถเช•เซ‡ เชจเชนเซ€เช‚:

rm -rf ${directory_name}/*

เชฎเชนเซ‡เชฐเชฌเชพเชจเซ€ เช•เชฐเซ€เชจเซ‡ เชจเซ‹เช‚เชง เช•เชฐเซ‹ เช•เซ‡ เชšเชฒ directory_name เชจเช•เซเช•เซ€ เชจเชฅเซ€.

เช†เชตเชพ เชฆเซƒเชถเซเชฏเซ‹เชจเซ‡ เชนเซ‡เชจเซเชกเชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฌเชฟเชฒเซเชŸ-เช‡เชจ เชซเช‚เช•เซเชถเชจเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เช›เซ‡ setเชœเซ‡เชฎ เช•เซ‡ set -o errexit, set -o pipefail เช…เชฅเชตเชพ set -o nounset เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚. เช† เช•เชพเชฐเซเชฏเซ‹ เชธเซเชจเชฟเชถเซเชšเชฟเชค เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เชคเชฎเชพเชฐเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช•เซ‹เชˆ เชชเชฃ เชฌเชฟเชจ-เชถเซ‚เชจเซเชฏ เชเช•เซเชเชฟเชŸ เช•เซ‹เชก, เช…เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชšเชฒเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช—, เชชเชพเช‡เชช เช‰เชชเชฐเชฅเซ€ เชชเชธเชพเชฐ เชฅเชฏเซ‡เชฒ เช…เชฎเชพเชจเซเชฏ เช†เชฆเซ‡เชถเซ‹, เชตเช—เซ‡เชฐเซ‡เชจเซ‹ เชธเชพเชฎเชจเซ‹ เช•เชฐเซ‡ เช•เซ‡ เชคเชฐเชค เชœ เชฌเชนเชพเชฐ เชจเซ€เช•เชณเซ€ เชœเชถเซ‡:

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

เช† เชฐเซ€เชคเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฒเช–เชตเชพเชฅเซ€ เชคเชฎเชจเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชฎเชพเช‚เชจเชพ เชคเชฎเชพเชฎ เช†เชฆเซ‡เชถเซ‹เชจเชพ เชตเชฐเซเชคเชจ เชตเชฟเชถเซ‡ เชตเชงเซ เชธเชพเชตเชšเซ‡เชค เชฐเชนเซ‡เชตเชพเชจเซ€ เชซเชฐเชœ เชชเชกเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เชคเชฎเชจเซ‡ เช†เชถเซเชšเชฐเซเชฏเชšเช•เชฟเชค เช•เชฐเซ‡ เชคเซ‡ เชชเชนเซ‡เชฒเชพเช‚ เชญเซ‚เชฒเชจเซ€ เชธเช‚เชญเชพเชตเชจเชพเชจเซ€ เช…เชชเซ‡เช•เซเชทเชพ เชฐเชพเช–เซ‡ เช›เซ‡.

เชตเชฟเช•เชพเชธ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชญเซ‚เชฒเซ‹ เชถเซ‹เชงเชตเชพ เชฎเชพเชŸเซ‡ เชถเซ‡เชฒเชšเซ‡เช•

เชคเซ‡ เช•เช‚เชˆเช• เชธเช‚เช•เชฒเชฟเชค เชตเชฐเซเชฅ เช›เซ‡ เชถเซ‡เชฒเชšเซ‡เช• เชถเซเชฐเซ‡เชทเซเช  เชชเซเชฐเชฅเชพเช“ เชธเชพเชฎเซ‡ เชคเชฎเชพเชฐเชพ เชฌเซ‡เชถ เช•เซ‹เชกเชจเซ‡ เชคเชชเชพเชธเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเชพ เชตเชฟเช•เชพเชธ เช…เชจเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เชชเชพเช‡เชชเชฒเชพเช‡เชจเซเชธเชฎเชพเช‚.

เชนเซเช‚ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฎเชพเชฐเชพ เชธเซเชฅเชพเชจเชฟเช• เชตเชฟเช•เชพเชธ เชตเชพเชคเชพเชตเชฐเชฃเชฎเชพเช‚ เชตเชพเช•เซเชฏเชฐเชšเชจเชพ, เชธเชฟเชฎเซ‡เชจเซเชŸเชฟเช•เซเชธ เช…เชจเซ‡ เช•เซ‹เชกเชฎเชพเช‚เชจเซ€ เช•เซ‡เชŸเชฒเซ€เช• เชญเซ‚เชฒเซ‹ เชตเชฟเชถเซ‡ เชฐเชฟเชชเซ‹เชฐเซเชŸเซเชธ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฐเซเช‚ เช›เซเช‚ เชœเซ‡ เชตเชฟเช•เชพเชธ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชนเซเช‚ เชšเซ‚เช•เซ€ เช—เชฏเซ‹ เชนเซ‹เชˆเชถ. เช† เชคเชฎเชพเชฐเซ€ เชฌเซ‡เชถ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซเชธ เชฎเชพเชŸเซ‡ เชเช• เชธเซเชฅเชฟเชฐ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชธเชพเชงเชจ เช›เซ‡ เช…เชจเซ‡ เชนเซเช‚ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เช–เซ‚เชฌ เชญเชฒเชพเชฎเชฃ เช•เชฐเซเช‚ เช›เซเช‚.

เชคเชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ เชเช•เซเชเชฟเชŸ เช•เซ‹เชกเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡

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
}

เช‰เชฆเชพเชนเชฐเชฃ: เช•เซƒเชชเชพ เช•เชฐเซ€เชจเซ‡ เช†เช•เชธเซเชฎเชฟเช• เชฐเซ€เชคเซ‡ เช“เชตเชฐเชฐเชพเช‡เชกเชฟเช‚เช— เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชšเชฒเซ‹เชจเซ‡ เชŸเชพเชณเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเซ‡เชฒ เชšเชฒ เชจเชพเชฎเซ‹ เชธเชพเชฅเซ‡ เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เชธเชพเชตเชšเซ‡เชค เชฐเชนเซ‹.

เชฒเซ‹เช—เซ€เช‚เช— เช•เชพเชฐเซเชฏเซ‹

เชคเชฎเชพเชฐเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเชพ เชชเชฐเชฟเชฃเชพเชฎเซ‹เชจเซ‡ เชธเชฐเชณเชคเชพเชฅเซ€ เชธเชฎเชœเชตเชพ เชฎเชพเชŸเซ‡ เชธเซเช‚เชฆเชฐ เช…เชจเซ‡ เชธเช‚เชฐเชšเชฟเชค เชฒเซ‹เช—เชฟเช‚เช— เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เช›เซ‡. เช…เชจเซเชฏ เช‰เชšเซเชš-เชธเซเชคเชฐเชจเซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชญเชพเชทเชพเช“เชจเซ€ เชœเซ‡เชฎ, เชนเซเช‚ เชนเช‚เชฎเซ‡เชถเชพ เชฎเชพเชฐเซ€ เชฌเซ‡เชถ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซเชธเชฎเชพเช‚ เชจเซ‡เชŸเชฟเชต เชฒเซ‹เช—เซ€เช‚เช— เชซเช‚เช•เซเชถเชจเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเช‚ เช›เซเช‚, เชœเซ‡เชฎ เช•เซ‡ __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, เชœเซเชฏเชพเช‚ เช†เชตเชพ เชฒเซ‹เช—เชฐ เชตเซ‡เชฐเชฟเชฏเซ‡เชฌเชฒเซเชธ เช…เชจเซ‡ เช…เชจเซเชฏ เชธเชฟเชธเซเชŸเชฎ เชตเซ‡เชฐเชฟเชฏเซ‡เชฌเชฒเซเชธ เช†เชฐเช‚เชญ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชฅเชตเชพ เชกเชฟเชซเซ‹เชฒเซเชŸ เชฎเซ‚เชฒเซเชฏเซ‹ เชชเชฐ เชธเซ‡เชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช† เชšเชฒเซ‹เชจเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เช‡เชจเซเชตเซ‹เช•เซ‡เชถเชจ เชฆเชฐเชฎเชฟเชฏเชพเชจ เช•เชฎเชพเชจเซเชก เชฒเชพเช‡เชจ เชตเชฟเช•เชฒเซเชชเซ‹เชฎเชพเช‚เชฅเซ€ เชชเชฃ เชธเซ‡เชŸ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.

เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช•เช‚เชˆเช• เช†เชจเชพ เชœเซ‡เชตเซเช‚:

$ ./run-script.sh --debug

เชœเซเชฏเชพเชฐเซ‡ เช†เชตเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชšเชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชคเซ‡ เชธเซเชจเชฟเชถเซเชšเชฟเชค เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เชœเซ‹ เชœเชฐเซ‚เชฐเซ€ เชนเซ‹เชฏ เชคเซ‹ เชธเชฟเชธเซเชŸเชฎ-เชตเซเชฏเชพเชชเซ€ เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เชกเชฟเชซเซ‹เชฒเซเชŸ เชฎเซ‚เชฒเซเชฏเซ‹ เชชเชฐ เชธเซ‡เชŸ เช›เซ‡, เช…เชฅเชตเชพ เชœเซ‹ เชœเชฐเซ‚เชฐเซ€ เชนเซ‹เชฏ เชคเซ‹ เช“เช›เชพเชฎเชพเช‚ เช“เช›เซเช‚ เช•เช‚เชˆเช• เชฏเซ‹เช—เซเชฏ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชนเซเช‚ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชฏเซเชเชฐ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เช…เชจเซ‡ เช•เชจเซเชซเชฟเช—เซเชฏเซเชฐเซ‡เชถเชจเชจเซ€ เชตเชฟเช—เชคเซ‹ เช•เซ‡ เชœเซ‡ เชฏเซเชเชฐ เชธเชฎเชœเซ€ เชถเช•เซ‡/เช•เชฐเชตเซ€ เชœเซ‹เชˆเช เชคเซ‡ เชตเชšเซเชšเซ‡ เชŸเซเชฐเซ‡เชก-เช“เชซ เชชเชฐ เชถเซเช‚ เชถเชฐเซ‚ เช•เชฐเชตเซเช‚ เช…เชจเซ‡ เชถเซเช‚ เชจ เช•เชฐเชตเซเช‚ เชคเซ‡เชจเซ€ เชชเชธเช‚เชฆเช—เซ€เชจเซ‹ เช†เชงเชพเชฐ เชฐเชพเช–เซเช‚ เช›เซเช‚.

เชชเซเชจเชƒเช‰เชชเชฏเซ‹เช— เช…เชจเซ‡ เชธเซเชตเชšเซเช› เชธเชฟเชธเซเชŸเชฎ เชธเซเชฅเชฟเชคเชฟ เชฎเชพเชŸเซ‡ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ

เชฎเซ‹เชกเซเชฏเซเชฒเชฐ/เชชเซเชจเชƒเช‰เชชเชฏเซ‹เช—เซ€ เช•เซ‹เชก

โ”œโ”€โ”€ framework
โ”‚   โ”œโ”€โ”€ common
โ”‚   โ”‚   โ”œโ”€โ”€ loggers.sh
โ”‚   โ”‚   โ”œโ”€โ”€ mail_reports.sh
โ”‚   โ”‚   โ””โ”€โ”€ slack_reports.sh
โ”‚   โ””โ”€โ”€ daily_database_operation.sh

เชนเซเช‚ เชเช• เช…เชฒเช— เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€ เชฐเชพเช–เซเช‚ เช›เซเช‚ เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชนเซเช‚ เชจเชตเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ/เชฌเซ‡เชถ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‡ เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช•เชฐเซ€ เชถเช•เซเช‚ เช›เซเช‚ เชœเซ‡เชจเซ‡ เชนเซเช‚ เชตเชฟเช•เชธเชพเชตเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚. เชชเซเชจเชƒเช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เชพเชฏ เชคเซ‡เชตเซ€ เช•เซ‹เชˆเชชเชฃ เชตเชธเซเชคเซ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชฎเชพเช‚ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเช‚เช—เชคเชพ เช…เชจเซเชฏ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธ เชฆเซเชตเชพเชฐเชพ เชชเซเชจเชƒเชชเซเชฐเชพเชชเซเชค เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ‡ เช† เชฐเซ€เชคเซ‡ เช—เซ‹เช เชตเชตเชพเชฅเซ€ เช…เชจเซเชฏ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเชพ เช•เชฆเชฎเชพเช‚ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เช˜เชŸเชพเชกเซ‹ เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เช เชชเชฃ เชธเซเชจเชฟเชถเซเชšเชฟเชค เช•เชฐเซ‡ เช›เซ‡ เช•เซ‡ เช•เซ‹เชก เชฌเซ‡เช เชจเชพเชจเซ‹ เช…เชจเซ‡ เชšเช•เชพเชธเชตเชพ เชฎเชพเชŸเซ‡ เชธเชฐเชณ เช›เซ‡.

เช‰เชชเชฐเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชจเซ€ เชœเซ‡เชฎ, เชฌเชงเชพ เชฒเซ‹เช—เซ€เช‚เช— เช•เชพเชฐเซเชฏเซ‹ เชœเซ‡เชฎ เช•เซ‡ __msg_info, __msg_error เช…เชจเซ‡ เช…เชจเซเชฏ, เชœเซ‡เชฎ เช•เซ‡ เชธเซเชฒเซ‡เช• เชฐเชฟเชชเซ‹เชฐเซเชŸเซเชธ, เช…เชฒเช—เชฅเซ€ เชธเชฎเชพเชฏเซ‡เชฒ เช›เซ‡ 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)"

เช•เชพเชฐเซเชฏ เชชเซ‚เชฐเซเชฃ เชฅเชฏเชพ เชชเช›เซ€, เช‰เชชเชฐ เชšเชฐเซเชšเชพ เช•เชฐเซ‡เชฒ เชนเซ‚เช• เชนเซ‡เชจเซเชกเชฒเชฐเซเชธเชฎเชพเช‚ เช†เชตเซ€ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เช“เชจเซ€ เชธเชซเชพเชˆ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชœเซ‹ เช•เชพเชฎเชšเชฒเชพเช‰ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เช“เชจเซเช‚ เชงเซเชฏเชพเชจ เชฐเชพเช–เชตเชพเชฎเชพเช‚ เชจ เช†เชตเซ‡, เชคเซ‹ เชคเซ‡เช“ เชเช•เช เชพ เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เช…เชฎเซเช• เชคเชฌเช•เซเช•เซ‡ เชนเซ‹เชธเซเชŸ เชชเชฐ เช…เชฃเชงเชพเชฐเซ€ เชธเชฎเชธเซเชฏเชพเช“เชจเซเช‚ เช•เชพเชฐเชฃ เชฌเชจเซ‡ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃ เชกเชฟเชธเซเช•.

เชฒเซ‹เช• เชซเชพเช‡เชฒเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช—

เช˜เชฃเซ€เชตเชพเชฐ เชคเชฎเชพเชฐเซ‡ เช–เชพเชคเชฐเซ€ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช•เซ‡ เช•เซ‹เชˆ เชชเชฃ เชธเชฎเชฏเซ‡ เชนเซ‹เชธเซเชŸ เชชเชฐ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‹ เชฎเชพเชคเซเชฐ เชเช• เชœ เชฆเชพเช–เชฒเซ‹ เชšเชพเชฒเซ€ เชฐเชนเซเชฏเซ‹ เช›เซ‡. เช† เชฒเซ‹เช• เชซเชพเช‡เชฒเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.

เชนเซเช‚ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชฒเซ‰เช• เชซเชพเช‡เชฒเซ‹ เช…เช‚เชฆเชฐ เชฌเชจเชพเชตเซเช‚ เช›เซเช‚ /tmp/project_name/*.lock เช…เชจเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เชคเซ‡เชฎเชจเซ€ เชนเชพเชœเชฐเซ€ เชคเชชเชพเชธเซ‹. เช† เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‡ เชธเซเช‚เชฆเชฐ เชฐเซ€เชคเซ‡ เชธเชฎเชพเชชเซเชค เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชธเชฎเชพเช‚เชคเชฐ เชšเชพเชฒเชคเซ€ เชฌเซ€เชœเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฆเซเชตเชพเชฐเชพ เชธเชฟเชธเซเชŸเชฎเชจเซ€ เชธเซเชฅเชฟเชคเชฟเชฎเชพเช‚ เช…เชฃเชงเชพเชฐเซเชฏเชพ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ‡ เชŸเชพเชณเซ‡ เช›เซ‡. เชœเซ‹ เชคเชฎเชจเซ‡ เช†เชชเซ‡เชฒ เชนเซ‹เชธเซเชŸ เชชเชฐ เชธเชฎเชพเช‚เชคเชฐ เชฐเซ€เชคเซ‡ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชธเชฎเชพเชจ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ เชคเซ‹ เชฒเซ‹เช• เชซเชพเช‡เชฒเซ‹เชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€.

เชฎเชพเชชเซ‹ เช…เชจเซ‡ เชธเซเชงเชพเชฐเซ‹

เช…เชฎเชพเชฐเซ‡ เช˜เชฃเซ€เชตเชพเชฐ เชเชตเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเซ‡ เช›เซ‡ เชœเซ‡ เชฒเชพเช‚เชฌเชพ เชธเชฎเชฏ เชธเซเชงเซ€ เชšเชพเชฒเซ‡ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ เชฆเซˆเชจเชฟเช• เชกเซ‡เชŸเชพเชฌเซ‡เช เช•เชพเชฎเช—เซ€เชฐเซ€. เช†เชตเชพ เช“เชชเชฐเซ‡เชถเชจเซเชธเชฎเชพเช‚ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชชเช—เชฒเชพเช‚เช“เชจเซ‹ เช•เซเชฐเชฎ เชธเชพเชฎเซ‡เชฒ เชนเซ‹เชฏ เช›เซ‡: เชกเซ‡เชŸเชพ เชฒเซ‹เชก เช•เชฐเชตเซ‹, เชตเชฟเชธเช‚เช—เชคเชคเชพเช“ เชฎเชพเชŸเซ‡ เชคเชชเชพเชธ เช•เชฐเชตเซ€, เชกเซ‡เชŸเชพ เช†เชฏเชพเชค เช•เชฐเชตเซ‹, เชธเซเชŸเซ‡เชŸเชธ เชฐเชฟเชชเซ‹เชฐเซเชŸ เชฎเซ‹เช•เชฒเชตเซ‹ เชตเช—เซ‡เชฐเซ‡.

เช†เชตเชพ เช•เชฟเชธเซเชธเชพเช“เชฎเชพเช‚, เชนเซเช‚ เชนเช‚เชฎเซ‡เชถเชพ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‡ เช…เชฒเช—-เช…เชฒเช— เชจเชพเชจเซ€ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ‹เชฎเชพเช‚ เชตเชฟเชญเชพเชœเซ€เชค เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซเช‚ เช›เซเช‚ เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ€ เชธเซเชฅเชฟเชคเชฟ เช…เชจเซ‡ เช…เชฎเชฒเชจเชพ เชธเชฎเชฏเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชœเชพเชฃ เช•เชฐเซเช‚ เช›เซเช‚:

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

เชชเช›เซ€เชฅเซ€ เชนเซเช‚ เช†เชจเซ€ เชธเชพเชฅเซ‡ เช…เชฎเชฒเชจเซ‹ เชธเชฎเชฏ เชœเซ‹เชˆ เชถเช•เซเช‚ เช›เซเช‚:

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

เช† เชฎเชจเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซเชธเชฎเชพเช‚ เชธเชฎเชธเซเชฏเชพ/เชงเซ€เชฎเชพ เชตเชฟเชธเซเชคเชพเชฐเซ‹เชจเซ‡ เช“เชณเช–เชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡เชจเซ‡ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ เช›เซ‡.

เชธเชพเชฐเชพ เชจเชธเซ€เชฌ!

เชฌเซ€เชœเซเช‚ เชถเซเช‚ เชตเชพเช‚เชšเชตเซเช‚:

  1. เชœเชพเช“ เช…เชจเซ‡ GPU เช•เซ‡เชถ.
  2. Mail.ru เช•เซเชฒเชพเช‰เชก เชธเซ‹เชฒเซเชฏเซเชถเชจเซเชธเชจเชพ S3 เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชธเซเชŸเซ‹เชฐเซ‡เชœเชฎเชพเช‚ เชตเซ‡เชฌเชนเซเช•เซเชธ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช‡เชตเซ‡เชจเซเชŸ-เช†เชงเชพเชฐเชฟเชค เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ.
  3. เชกเชฟเชœเชฟเชŸเชฒ เชŸเซเชฐเชพเชจเซเชธเชซเซ‹เชฐเซเชฎเซ‡เชถเชจ เชตเชฟเชถเซ‡ เช…เชฎเชพเชฐเซ€ เชŸเซ‡เชฒเชฟเช—เซเชฐเชพเชฎ เชšเซ‡เชจเชฒ.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹