เจฌเฉˆเจธเจผ เจธเจ•เฉเจฐเจฟเจชเจŸเจฟเฉฐเจ— เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธ: เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— เจ…เจคเฉ‡ เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจฌเฉˆเจธเจผ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจฒเจˆ เจ‡เฉฑเจ• เจคเฉ‡เจœเจผ เจ—เจพเจˆเจก

เจฌเฉˆเจธเจผ เจธเจ•เฉเจฐเจฟเจชเจŸเจฟเฉฐเจ— เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธ: เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— เจ…เจคเฉ‡ เจชเฉเจฐเจฆเจฐเจธเจผเจจ เจฌเฉˆเจธเจผ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจฒเจˆ เจ‡เฉฑเจ• เจคเฉ‡เจœเจผ เจ—เจพเจˆเจก
เจฎเจจเจพเจชเฉ€ เจฆเฉเจ†เจฐเจพ เจธเจผเฉˆเฉฑเจฒ เจตเจพเจฒเจชเฉ‡เจชเจฐ

เจฌเฉˆเจธเจผ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจกเฉ€เจฌเฉฑเจ— เจ•เจฐเจจเจพ เจนเฉˆเจธเจŸเฉˆเจ• เจตเจฟเฉฑเจš เจธเฉ‚เจˆ เจฒเฉฑเจญเจฃ เจตเจพเจ‚เจ— เจนเฉˆ, เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡ เจœเจฆเฉ‹เจ‚ เจฎเฉŒเจœเฉ‚เจฆเจพ เจ•เฉ‹เจกเจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจขเจพเจ‚เจšเฉ‡, เจฒเฉŒเจ—เจฟเฉฐเจ— เจ…เจคเฉ‡ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ—เจคเจพ เจฆเฉ‡ เจฎเฉเฉฑเจฆเจฟเจ†เจ‚ 'เจคเฉ‡ เจธเจฎเฉ‡เจ‚ เจธเจฟเจฐ เจตเจฟเจšเจพเจฐ เจ•เฉ€เจคเฉ‡ เจฌเจฟเจจเจพเจ‚ เจจเจตเฉ‡เจ‚ เจœเฉ‹เฉœ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเฉ‡ เจนเจจเฅค เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจ†เจช เจจเฉ‚เฉฐ เจ…เจœเจฟเจนเฉ€เจ†เจ‚ เจธเจฅเจฟเจคเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจœเจพเจ‚ เจคเจพเจ‚ เจ†เจชเจฃเฉ€เจ†เจ‚ เจ—เจฒเจคเฉ€เจ†เจ‚ เจ•เจฐเจ•เฉ‡ เจœเจพเจ‚ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจฆเฉ‡ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจขเฉ‡เจฐเจพเจ‚ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจฒเฉฑเจญ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจฆเฉ€ เจŸเฉ€เจฎ 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

เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฒเจฟเจ–เจฃเจพ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเจ•เฉเจฐเจฟเจชเจŸ เจตเจฟเฉฑเจš เจธเจพเจฐเฉ€เจ†เจ‚ เจ•เจฎเจพเจ‚เจกเจพเจ‚ เจฆเฉ‡ เจตเจฟเจตเจนเจพเจฐ เจฌเจพเจฐเฉ‡ เจตเจงเฉ‡เจฐเฉ‡ เจธเจพเจตเจงเจพเจจ เจฐเจนเจฟเจฃ เจฒเจˆ เจฎเจœเจผเจฌเฉ‚เจฐ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจนเฉˆเจฐเจพเจจ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจ‡เฉฑเจ• เจ—เจฒเจคเฉ€ เจฆเฉ€ เจธเฉฐเจญเจพเจตเจจเจพ เจฆเจพ เจ…เฉฐเจฆเจพเจœเจผเจพ เจฒเจ—เจพเจ‰เจ‚เจฆเจพ เจนเฉˆเฅค

เจตเจฟเจ•เจพเจธ เจฆเฉŒเจฐเจพเจจ เจ—เจฒเจคเฉ€เจ†เจ‚ เจฆเจพ เจชเจคเจพ เจฒเจ—เจพเจ‰เจฃ เจฒเจˆ ShellCheck

เจ‡เจน เจตเจฐเจ—เจพ เจ•เฉเจ เจเจ•เฉ€เจ•เฉเจฐเจฟเจค เจ•เจฐเจจ เจฏเฉ‹เจ— เจนเฉˆ เจธเจผเฉˆเฉฑเจฒ เจšเฉˆเฉฑเจ• เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธเจพเจ‚ เจฆเฉ‡ เจตเจฟเจฐเฉเฉฑเจง เจคเฉเจนเจพเจกเฉ‡ เจฌเฉˆเจธเจผ เจ•เฉ‹เจก เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฒเจˆ เจคเฉเจนเจพเจกเฉ‡ เจตเจฟเจ•เจพเจธ เจ…เจคเฉ‡ เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจชเจพเจˆเจชเจฒเจพเจˆเจจเจพเจ‚ เจตเจฟเฉฑเจšเฅค

เจฎเฉˆเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจ†เจชเจฃเฉ‡ เจธเจฅเจพเจจเจ• เจตเจฟเจ•เจพเจธ เจตเจพเจคเจพเจตเจฐเจฃเจพเจ‚ เจตเจฟเฉฑเจš เจธเฉฐเจŸเฉˆเจ•เจธ, เจธเจฟเจฎเฉˆเจ‚เจŸเจฟเจ•เจธ, เจ…เจคเฉ‡ เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจ•เฉเจ เจ—เจฒเจคเฉ€เจ†เจ‚ เจฌเจพเจฐเฉ‡ เจฐเจฟเจชเฉ‹เจฐเจŸเจพเจ‚ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฒเจˆ เจตเจฐเจคเจฆเจพ เจนเจพเจ‚ เจœเฉ‹ เจธเจผเจพเจ‡เจฆ เจฎเฉˆเจ‚ เจตเจฟเจ•เจพเจธ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจ–เฉเฉฐเจ เจ—เจฟเจ† เจนเฉ‹เจตเฉ‡เฅค เจ‡เจน เจคเฉเจนเจพเจกเฉ€เจ†เจ‚ เจฌเฉˆเจธเจผ เจธเจ•เฉเจฐเจฟเจชเจŸเจพเจ‚ เจฒเจˆ เจ‡เฉฑเจ• เจธเจฅเจฟเจฐ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจŸเฉ‚เจฒ เจนเฉˆ เจ…เจคเฉ‡ เจฎเฉˆเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจตเจฐเจคเจฃ เจฆเฉ€ เจœเจผเฉ‹เจฐเจฆเจพเจฐ เจธเจฟเจซเจพเจฐเจธเจผ เจ•เจฐเจฆเจพ เจนเจพเจ‚.

เจ†เจชเจฃเฉ‡ เจ–เฉเจฆ เจฆเฉ‡ เจเจ—เจœเจผเจฟเจŸ เจ•เฉ‹เจกเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ

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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹