Bash ืกืงืจื™ืคึผื˜ื™ื ื’ ื‘ืขืกื˜ืขืจ ืคึผืจืึทืงื˜ื™ืกื™ื–: ืึท ืฉื ืขืœ ื’ื™ื™ื“ ืฆื• ืคืึทืจืœืึธื–ืœืขืš ืื•ืŸ ืคืึธืจืฉื˜ืขืœื•ื ื’ Bash ืกืงืจื™ืคึผืก

Bash ืกืงืจื™ืคึผื˜ื™ื ื’ ื‘ืขืกื˜ืขืจ ืคึผืจืึทืงื˜ื™ืกื™ื–: ืึท ืฉื ืขืœ ื’ื™ื™ื“ ืฆื• ืคืึทืจืœืึธื–ืœืขืš ืื•ืŸ ืคืึธืจืฉื˜ืขืœื•ื ื’ Bash ืกืงืจื™ืคึผืก
ืฉืึธืœ ื˜ืึทืคึผืขื˜ืŸ ื“ื•ืจืš ืžืึทื ืึทืคึผื™

ื“ื™ื‘ืึทื’ื™ื ื’ ื‘ืึทืฉ ืกืงืจื™ืคึผืก ืื™ื– ื•ื•ื™ ืื™ืจ ื–ื•ื›ื˜ ืคึฟืึทืจ ืึท ื ืึธื“ืœ ืื™ืŸ ืึท ื›ื™ื™ืกื˜ืึทืง, ืกืคึผืขืฆื™ืขืœ ื•ื•ืขืŸ ื ื™ื™ึท ืึทื“ื™ืฉืึทื ื– ื“ืขืจืฉื™ื™ึทื ืขืŸ ืื™ืŸ ื“ื™ ื™ื’ื–ื™ืกื˜ื™ื ื’ ืงืึธื“ืขื‘ืึทืกืข ืึธืŸ ื‘ื™ื™ึทืฆื™ื™ึทื˜ื™ืง ื‘ืึทื˜ืจืึทื›ื˜ื•ื ื’ ืคื•ืŸ ื™ืฉื•ื– ืคื•ืŸ ืกื˜ืจื•ืงื˜ื•ืจ, ืœืึธื’ื™ื ื’ ืื•ืŸ ืจื™ืœื™ื™ืึทื‘ื™ืœืึทื˜ื™. ืื™ืจ ืงืขื ืขืŸ ื’ืขืคึฟื™ื ืขืŸ ื–ื™ืš ืื™ืŸ ืึทื–ืึท ืกื™ื˜ื•ืึทื˜ื™ืึธื ืก ืึธื“ืขืจ ืจืขื›ื˜ ืฆื• ื“ื™ื™ืŸ ืื™ื™ื’ืขื ืข ืžื™ืกื˜ื™ื™ืงืก ืึธื“ืขืจ ื•ื•ืขืŸ ืื™ืจ ืคื™ืจืŸ ืงืึธืžืคึผืœืขืงืก ืžืขืจื™ื“ืŸ ืคื•ืŸ ืกืงืจื™ืคึผืก.

ืงืึธืœืขืงื˜ื™ื•ื• 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. ื’ื™ื™ืŸ ืื•ืŸ ื’ืคึผื• ืงืึทื˜ืฉืขืก.
  2. ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคื•ืŸ ืึท ื’ืขืฉืขืขื ื™ืฉ-ื’ืขื˜ืจื™ื‘ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื‘ืื–ื™ืจื˜ ืื•ื™ืฃ ื•ื•ืขื‘ื”ืึธืึธืงืก ืื™ืŸ ื“ื™ S3 ื›ื™ื™ืคืขืฅ ืกื˜ืึธืจื™ื“ื–ืฉ ืคื•ืŸ Mail.ru ืงืœืึธื•ื“ ืกืึทืœื•ืฉืึทื ื–.
  3. ืื•ื ื“ื–ืขืจ ื˜ืขืœืขื’ืจืึทื ืงืึทื ืึทืœ ื•ื•ืขื’ืŸ ื“ื™ื’ื™ื˜ืึทืœ ื˜ืจืึทื ืกืคืึธืจืžืึทืฆื™ืข.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’