αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž›αŸ’αž’αž”αŸ†αž•αž»αžαž“αŸƒαžŸαŸ’αž‚αŸ’αžšαžΈαž” Bash: αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžšαž αŸαžŸαž…αŸ†αž–αŸ„αŸ‡αžŸαŸ’αž‚αŸ’αžšαžΈαž” Bash αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš

αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž›αŸ’αž’αž”αŸ†αž•αž»αžαž“αŸƒαžŸαŸ’αž‚αŸ’αžšαžΈαž” Bash: αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžšαž αŸαžŸαž…αŸ†αž–αŸ„αŸ‡αžŸαŸ’αž‚αŸ’αžšαžΈαž” Bash αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš
αž•αŸ’αž‘αžΆαŸ†αž„αžšαžΌαž”αž—αžΆαž–αžŸαŸ‚αž›αžŠαŸ„αž™ manapi

αž€αžΆαžšαž”αŸ†αž”αžΆαžαŸ‹αž€αŸ†αž αž»αžŸαžŸαŸ’αž‚αŸ’αžšαžΈαž” bash αž‚αžΊαžŠαžΌαž…αž‡αžΆαž€αžΆαžšαžŸαŸ’αžœαŸ‚αž„αžšαž€αž˜αŸ’αž‡αž»αž›αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαž›αžŸαŸ’αž˜αŸ… αž‡αžΆαž–αž·αžŸαŸαžŸαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αžαŸ’αž˜αžΈαž›αŸαž…αž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž€αžΌαžŠαžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹αžŠαŸ„αž™αž˜αž·αž“αž”αžΆαž“αž–αž·αž…αžΆαžšαžŽαžΆαž‘αžΆαž“αŸ‹αž–αŸαž›αžœαŸαž›αžΆαž’αŸ†αž–αžΈαž”αž‰αŸ’αž αžΆαž“αŸƒαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž€αžΆαžšαž€αžΆαž”αŸ‹αžˆαžΎ αž“αž·αž„αž—αžΆαž–αž‡αžΏαž‡αžΆαž€αŸ‹αŸ” αž’αŸ’αž“αž€β€‹αž’αžΆαž…β€‹αžƒαžΎαž‰β€‹αžαŸ’αž›αž½αž“β€‹αž’αŸ’αž“αž€β€‹αžŸαŸ’αžαž·αžβ€‹αž€αŸ’αž“αž»αž„β€‹αžŸαŸ’αžαžΆαž“αž—αžΆαž–β€‹αž”αŸ‚αž”β€‹αž“αŸαŸ‡β€‹αžŠαŸ„αž™β€‹αžŸαžΆαžšβ€‹αž€αŸ†αž αž»αžŸβ€‹αž•αŸ’αž‘αžΆαž›αŸ‹β€‹αžαŸ’αž›αž½αž“β€‹αžšαž”αžŸαŸ‹β€‹αž’αŸ’αž“αž€β€‹αž¬β€‹αž“αŸ…β€‹αž–αŸαž›β€‹αžŠαŸ‚αž›β€‹αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„β€‹αž‚αŸ†αž“αžšβ€‹αžŸαŸ’αž‚αŸ’αžšαžΈαž”β€‹αžŠαŸβ€‹αžŸαŸ’αž˜αž»αž‚αžŸαŸ’αž˜αžΆαž‰αŸ”

αž€αŸ’αžšαž»αž˜αž€αžΆαžšαž„αžΆαžš αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž–αž–αž€ Mail.ru αž”αž€αž”αŸ’αžšαŸ‚αž’αžαŸ’αžαž”αž‘αžŠαŸ‚αž›αž˜αžΆαž“αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŠαŸ‚αž›αž“αžΉαž„αž‡αž½αž™αž’αŸ’αž“αž€αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαžšαžŸαŸαžš αž”αŸ†αž”αžΆαžαŸ‹αž€αŸ†αž αž»αžŸ αž“αž·αž„αžšαž€αŸ’αžŸαžΆαžŸαŸ’αž‚αŸ’αžšαžΈαž”αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αžΆαž“αž”αŸ’αžšαžŸαžΎαžšαž‡αžΆαž„αž˜αž»αž“αŸ” αž‡αžΏαž¬αž˜αž·αž“αž‡αžΏ αž‚αŸ’αž˜αžΆαž“αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž’αžΆαž…αž™αž€αžˆαŸ’αž“αŸ‡αž€αžΆαžšαž–αŸαž‰αž…αž·αžαŸ’αžαž“αŸƒαž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αžΌαžŠ bash αžŸαŸ’αž’αžΆαž αž“αž·αž„αžšαž½αž…αžšαžΆαž›αŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αŸ’αžšαžΎ αžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžšαžΆαž›αŸ‹αž–αŸαž›αŸ”

αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž“αžΌαžœαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž‚αžΆαžαŸ‹αž”αžΆαž“αžšαŸ€αž“αž€αŸ’αž“αž»αž„αžšαž™αŸˆαž–αŸαž›αž”αŸ‰αž»αž“αŸ’αž˜αžΆαž“αž†αŸ’αž“αžΆαŸ†αž…αž»αž„αž€αŸ’αžšαŸ„αž™αž“αŸαŸ‡ αž€αŸαžŠαžΌαž…αž‡αžΆαž€αŸ†αž αž»αžŸαž‘αžΌαž‘αŸ…αž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαŸ‚αž›αž’αŸ’αžœαžΎαž’αŸ„αž™αž‚αžΆαžαŸ‹αž˜αžΆαž“αž€αžΆαžšαž”αŸ’αžšαž»αž„αž”αŸ’αžšαž™αŸαžαŸ’αž“αŸ” αž“αŸαŸ‡αž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αžŽαžΆαžŸαŸ‹ αž–αžΈαž–αŸ’αžšαŸ„αŸ‡αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαžαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‚αŸ’αžšαž”αŸ‹αžšαžΌαž” αž“αŸ…αž…αŸ†αžŽαž»αž…αžαŸ’αž›αŸ‡αž€αŸ’αž“αž»αž„αž’αžΆαž‡αžΈαž–αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸ αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αžŸαŸ’αž‚αŸ’αžšαžΈαž” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž€αž˜αŸ’αž˜αž€αžΆαžšαž„αžΆαžšαž‡αžΆαž”αŸ’αžšαž…αžΆαŸ†αŸ”

αž§αž”αž€αžšαžŽαŸαž…αžΆαž”αŸ‹αž’αž“αŸ’αž‘αžΆαž€αŸ‹

αžŸαŸ’αž‚αŸ’αžšαžΈαž” bash αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž‡αž½αž”αž”αŸ’αžšαž‘αŸ‡αž˜αž·αž“αžŠαŸ‚αž›αž”αŸ’αžšαžΎαž™αž“αŸ’αžαž€αžΆαžšαžŸαž˜αŸ’αž’αžΆαžαžŠαŸαž˜αžΆαž“αž”αŸ’αžšαžŸαž·αž‘αŸ’αž’αž—αžΆαž–αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž˜αžΆαž“αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž˜αž·αž“αž“αžΉαž€αžŸαŸ’αž˜αžΆαž“αžŠαž›αŸ‹αž€αžΎαžαž‘αžΎαž„αž€αŸ†αž‘αž»αž„αž–αŸαž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαžŸαŸ’αž‚αŸ’αžšαžΈαž”αŸ”

αž€αžΆαžšαž—αŸ’αž‰αžΆαž€αŸ‹αž•αŸ’αž’αžΎαž›αž’αžΆαž…αž€αžΎαžαž‘αžΎαž„αž–αžΈαžαžΆαž„αž€αŸ’αžšαŸ…αžŠαžΌαž…αž‡αžΆαž€αžΆαžšαž‘αž‘αž½αž›αžŸαž‰αŸ’αž‰αžΆαž–αžΈαžŸαŸ’αž“αžΌαž›αŸ” αž€αžΆαžšαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αžšαžŽαžΈαž”αŸ‚αž”αž“αŸαŸ‡αž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹αžαŸ’αž›αžΆαŸ†αž„αžŽαžΆαžŸαŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž’αžΆαž“αžΆαžαžΆαžŸαŸ’αž‚αŸ’αžšαžΈαž”αž˜αžΆαž“αž—αžΆαž–αž‡αžΏαž‡αžΆαž€αŸ‹αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž›αžΎαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž•αž›αž·αžαž€αž˜αŸ’αž˜αŸ” αž‡αžΆαžšαžΏαž™αŸ—αžαŸ’αž‰αž»αŸ†αž”αŸ’αžšαžΎαž§αž”αž€αžšαžŽαŸαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αžΆαžšαž…αŸαž‰αžŠαžΎαž˜αŸ’αž”αžΈαž†αŸ’αž›αžΎαž™αžαž”αž‘αŸ…αž“αžΉαž„αžŸαŸαžŽαžΆαžšαžΈαž™αŸ‰αžΌαžŠαžΌαž…αž“αŸαŸ‡αŸ–

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 αžŠαžΎαž˜αŸ’αž”αžΈαžšαž€αž˜αžΎαž›αž€αŸ†αž αž»αžŸαž€αŸ†αž‘αž»αž„αž–αŸαž›αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ

αžœαžΆαž˜αžΆαž“αžαž˜αŸ’αž›αŸƒαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž’αŸ’αžœαžΈαž˜αž½αž™αžŠαžΌαž…αž‡αžΆ αžŸαŸ‚αž›αžƒαŸαž€ αž‘αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αž—αž·αžœαžŒαŸ’αžαž“αŸ αž“αž·αž„αžŸαžΆαž€αž›αŸ’αž”αž„αž”αŸ†αž–αž„αŸ‹αž”αž„αŸ’αž αžΌαžšαž”αŸ’αžšαŸαž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αžŠαžΎαž˜αŸ’αž”αžΈαž–αž·αž“αž·αžαŸ’αž™αž˜αžΎαž›αž€αžΌαžŠ bash αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαž†αžΆαŸ†αž„αž“αžΉαž„αž€αžΆαžšαž’αž“αž»αžœαžαŸ’αžαž›αŸ’αž’αž”αŸ†αž•αž»αžαŸ”

αžαŸ’αž‰αž»αŸ†αž”αŸ’αžšαžΎαžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž”αžšαž·αž™αžΆαž€αžΆαžŸαž’αž—αž·αžœαžŒαŸ’αžαž“αŸαž€αŸ’αž“αž»αž„αžαŸ†αž”αž“αŸ‹αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αžšαž”αžΆαž™αž€αžΆαžšαžŽαŸαž’αŸ†αž–αžΈαžœαžΆαž€αŸ’αž™αžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž’αžαŸ’αžαž“αŸαž™ αž“αž·αž„αž€αŸ†αž αž»αžŸαž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αŸ’αžšαž αŸ‚αž›αž‡αžΆαžαž€αžαžΆαž“αž–αŸαž›αž€αŸ†αž–αž»αž„αž’αž—αž·αžœαžŒαŸ’αžαŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž§αž”αž€αžšαžŽαŸαžœαž·αž—αžΆαž‚αž‹αž·αžαž·αžœαž“αŸ’αžαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŸαŸ’αž‚αŸ’αžšαžΈαž” 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
}

αž…αŸ†αžŽαžΆαŸ†: αžŸαžΌαž˜αž”αŸ’αžšαž™αŸαžαŸ’αž“αž‡αžΆαž–αž·αžŸαŸαžŸαž‡αžΆαž˜αž½αž™αžˆαŸ’αž˜αŸ„αŸ‡αž’αžαŸαžšαžŠαŸ‚αž›αž’αŸ’αž“αž€αž€αŸ†αžŽαžαŸ‹ αžŠαžΎαž˜αŸ’αž”αžΈαž‡αŸ€αžŸαžœαžΆαž„αž€αžΆαžšαžαŸ’αžšαž½αžαž›αžΎαž’αžαŸαžšαž”αžšαž·αžŸαŸ’αžαžΆαž“αžŠαŸ„αž™αž…αŸƒαžŠαž“αŸ’αž™αŸ”

αž˜αž»αžαž„αžΆαžšαž€αžαŸ‹αžαŸ’αžšαžΆ

αž€αžΆαžšαž€αžαŸ‹αžαŸ’αžšαžΆαžŠαŸαžŸαŸ’αžšαžŸαŸ‹αžŸαŸ’αž’αžΆαž αž“αž·αž„αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž˜αžΆαž“αžŸαžΆαžšαŸˆαžŸαŸ†αžαžΆαž“αŸ‹ αžŠαžΎαž˜αŸ’αž”αžΈαž„αžΆαž™αžŸαŸ’αžšαž½αž›αž™αž›αŸ‹αž’αŸ†αž–αžΈαž›αž‘αŸ’αž’αž•αž›αž“αŸƒαžŸαŸ’αž‚αŸ’αžšαžΈαž”αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ” αžŠαžΌαž…αž‘αŸ…αž“αžΉαž„αž—αžΆαžŸαžΆαžŸαžšαžŸαŸαžšαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž€αž˜αŸ’αžšαž·αžαžαŸ’αž–αžŸαŸ‹αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ‚αžš αžαŸ’αž‰αž»αŸ†αžαŸ‚αž„αžαŸ‚αž”αŸ’αžšαžΎαž˜αž»αžαž„αžΆαžšαž€αžαŸ‹αžαŸ’αžšαžΆαžŠαžΎαž˜αž“αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αž‚αŸ’αžšαžΈαž” 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 αž”αŸ‚αž”αž“αŸαŸ‡ αž“αž·αž„αž’αžαŸαžšαž”αŸ’αžšαž–αŸαž“αŸ’αž’αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž¬αž€αŸ†αžŽαžαŸ‹αž‘αŸ…αž‡αžΆαžαž˜αŸ’αž›αŸƒαž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αŸ” αž’αžαŸαžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž€αŸαž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž–αžΈαž‡αž˜αŸ’αžšαžΎαžŸαž”αž“αŸ’αž‘αžΆαžαŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž€αŸ†αž‘αž»αž„αž–αŸαž›αž αŸ…αžŸαŸ’αž‚αŸ’αžšαžΈαž”αŸ”

αž§αž‘αžΆαž αžšαžŽαŸαž’αŸ’αžœαžΈαž˜αž½αž™αžŠαžΌαž…αž‡αžΆαŸ–

$ ./run-script.sh --debug

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž”αŸ‚αž”αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž· αžœαžΆαž’αžΆαž“αžΆαžαžΆαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž”αŸ’αžšαž–αŸαž“αŸ’αž’αž‘αžΆαŸ†αž„αž˜αžΌαž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αž‘αŸ…αž‡αžΆαžαž˜αŸ’αž›αŸƒαž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‘αžΆαž˜αž‘αžΆαžš αž¬αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‘αŸ…αž‡αžΆαž’αŸ’αžœαžΈαž˜αž½αž™αžŠαŸ‚αž›αžŸαž˜αžŸαŸ’αžšαž”αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž…αžΆαŸ†αž”αžΆαž…αŸ‹αŸ”

αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαžαŸ’αž‰αž»αŸ†αž•αŸ’αž’αŸ‚αž€αž›αžΎαž‡αž˜αŸ’αžšαžΎαžŸαž“αŸƒαž’αŸ’αžœαžΈαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž“αž·αž„αž’αŸ’αžœαžΈαžŠαŸ‚αž›αž˜αž·αž“αžαŸ’αžšαžΌαžœαž’αŸ’αžœαžΎαž“αŸ…αž›αžΎαž€αžΆαžšαžŠαŸ„αŸ‡αžŠαžΌαžšαžšαžœαžΆαž„αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž“αž·αž„αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŠαŸ‚αž›αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž’αžΆαž…/αž‚αž½αžšαžŸαŸ’αžœαŸ‚αž„αž™αž›αŸ‹αŸ”

αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‘αžΎαž„αžœαž·αž‰ αž“αž·αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŸαŸ’αž’αžΆαž

αž€αžΌαžŠαž˜αŸ‰αžΌαžŒαž»αž›/αž’αžΆαž…αž”αŸ’αžšαžΎαž‘αžΎαž„αžœαž·αž‰αž”αžΆαž“αŸ”

β”œβ”€β”€ framework
β”‚   β”œβ”€β”€ common
β”‚   β”‚   β”œβ”€β”€ loggers.sh
β”‚   β”‚   β”œβ”€β”€ mail_reports.sh
β”‚   β”‚   └── slack_reports.sh
β”‚   └── daily_database_operation.sh

αžαŸ’αž‰αž»αŸ†αžšαž€αŸ’αžŸαžΆαžƒαŸ’αž›αžΆαŸ†αž„αžŠαžΆαž…αŸ‹αžŠαŸ„αž™αž‘αŸ‚αž€αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž’αžΆαž…αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž‚αž˜αŸ’αžšαŸ„αž„αžαŸ’αž˜αžΈ/αžŸαŸ’αž‚αŸ’αžšαžΈαž” bash αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž’αž—αž·αžœαžŒαŸ’αžαŸ” αž’αŸ’αžœαžΈαž€αŸαžŠαŸ„αž™αžŠαŸ‚αž›αž’αžΆαž…αž”αŸ’αžšαžΎαž‘αžΎαž„αžœαž·αž‰αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αŸ’αž“αž»αž„αžƒαŸ’αž›αžΆαŸ†αž„ αž“αž·αž„αž‘αžΆαž‰αž™αž€αž˜αž€αžœαž·αž‰αžŠαŸ„αž™αž‚αž˜αŸ’αžšαŸ„αž„αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαžŠαŸ‚αž›αž…αž„αŸ‹αž”αŸ’αžšαžΎαž˜αž»αžαž„αžΆαžšαž“αŸ„αŸ‡αŸ” αž€αžΆαžšαžšαŸ€αž”αž…αŸ†αž‚αž˜αŸ’αžšαŸ„αž„αžαžΆαž˜αžœαž·αž’αžΈαž“αŸαŸ‡αž€αžΆαžαŸ‹αž”αž“αŸ’αžαž™αž‘αŸ†αž αŸ†αž“αŸƒαžŸαŸ’αž‚αŸ’αžšαžΈαž”αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž™αŸ‰αžΆαž„αž…αŸ’αžšαžΎαž“ αž αžΎαž™αž’αžΆαž“αžΆαžαžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž€αžΌαžŠαžαžΌαž… αž“αž·αž„αž„αžΆαž™αžŸαŸ’αžšαž½αž›αž€αŸ’αž“αž»αž„αž€αžΆαžšαžŸαžΆαž€αž›αŸ’αž”αž„αŸ”

αžŠαžΌαž…αž€αŸ’αž“αž»αž„αž§αž‘αžΆαž αžšαžŽαŸαžαžΆαž„αž›αžΎ αž˜αž»αžαž„αžΆαžšαž€αžαŸ‹αžαŸ’αžšαžΆαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαžΌαž…αž‡αžΆ __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)"

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αž‰αŸ’αž…αž”αŸ‹αž€αžΆαžšαž„αžΆαžšαž€αžΆαžšαžŸαž˜αŸ’αž’αžΆαžαžαžαž―αž€αžŸαžΆαžšαž”αŸ‚αž”αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž‡αžΌαž“αž“αŸ…αž€αŸ’αž“αž»αž„αž§αž”αž€αžšαžŽαŸαž…αžΆαž”αŸ‹αž‘αŸ†αž–αž€αŸ‹αžŠαŸ‚αž›αž”αžΆαž“αž–αž·αž—αžΆαž€αŸ’αžŸαžΆαžαžΆαž„αž›αžΎαŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžαžαž”αžŽαŸ’αžαŸ„αŸ‡αž’αžΆαžŸαž“αŸ’αž“αž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž‘αŸαž“αŸ„αŸ‡αž–αž½αž€αžœαžΆαž€αž€αž€αž»αž‰αž αžΎαž™αž“αŸ…αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αžαŸ’αž›αŸ‡αž”αžŽαŸ’αžαžΆαž›αž±αŸ’αž™αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαžŠαŸ‚αž›αž˜αž·αž“αž“αžΉαž€αžŸαŸ’αž˜αžΆαž“αžŠαž›αŸ‹αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžŠαžΌαž…αž‡αžΆαžαžΆαžŸαž–αŸαž‰αŸ”

αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž―αž€αžŸαžΆαžšαž…αžΆαž€αŸ‹αžŸαŸ„

αž‡αžΆαž‰αžΉαž€αž‰αž™ αž’αŸ’αž“αž€β€‹αžαŸ’αžšαžΌαžœβ€‹αž”αŸ’αžšαžΆαž€αžŠβ€‹αžαžΆβ€‹αž˜αžΆαž“β€‹αžαŸ‚β€‹αž§αž‘αžΆαž αžšαžŽαŸβ€‹αž˜αž½αž™β€‹αž“αŸƒβ€‹αžŸαŸ’αž‚αŸ’αžšαžΈαž”β€‹αžŠαŸ‚αž›β€‹αž€αŸ†αž–αž»αž„β€‹αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšβ€‹αž›αžΎβ€‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“β€‹αž“αŸ…β€‹αž–αŸαž›β€‹αžŽαžΆβ€‹αž˜αž½αž™β€‹αŸ” αž“αŸαŸ‡αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžŠαŸ„αž™αž”αŸ’αžšαžΎαž―αž€αžŸαžΆαžšαž…αžΆαž€αŸ‹αžŸαŸ„αŸ”

αž‡αžΆαž’αž˜αŸ’αž˜αžαžΆαžαŸ’αž‰αž»αŸ†αž”αž„αŸ’αž€αžΎαžαž―αž€αžŸαžΆαžšαž…αžΆαž€αŸ‹αžŸαŸ„ /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. αž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž‡αŸ†αžšαž»αž‰αžŠαŸ„αž™αž–αŸ’αžšαžΉαžαŸ’αžαž·αž€αžΆαžšαžŽαŸαž•αŸ’αž’αŸ‚αž€αž›αžΎ webhooks αž“αŸ…αž€αŸ’αž“αž»αž„αž€αž“αŸ’αž›αŸ‚αž„αž•αŸ’αž‘αž»αž€αžœαžαŸ’αžαž» S3 αž“αŸƒ Mail.ru Cloud Solutions αŸ”
  3. αž”αŸ‰αž»αžŸαŸ’αžαž·αŸαž‘αžΌαžšαž›αŸαžαžšαž”αžŸαŸ‹αž™αžΎαž„αž’αŸ†αž–αžΈαž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαžŒαžΈαž‡αžΈαžαž›αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹