ืืืชืืจ ืืืืื ืืกืงืจืืคืืื ืฉื 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 ืฉืื ืืื ื ืืืืืฅ ืืืื ืืืฉืชืืฉ ืื.
ืฉืืืืฉ ืืงืืื ืืฆืืื ืืฉืื
ืงืืื ืืืืจื ื-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
, ืืืฉืจ ืืฉืชื ื ืืืืจ ืืืื ืืืฉืชื ื ืืขืจืืช ืืืจืื ืืืืชืืืื ืื ืืืืืจืื ืืขืจืื ืืจืืจืช ืืืื. ื ืืชื ืืืืืืจ ืืฉืชื ืื ืืื ืื ืืชืื ืืคืฉืจืืืืช ืฉืืจืช ืืคืงืืื ืืืืื ืืคืขืืช ืกืงืจืืคื.
ืืืืืื, ืืฉืื ืืื:
$ ./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"
ืื ืขืืืจ ืื ืืืืืช ืืขืืืช/ืืืืจืื ืืืืืื ืืกืงืจืืคืืื ืฉืืงืืงืื ืืืืคืืืืืืฆืื.
ืืื ืืื!
ืื ืขืื ืืงืจืื:
Go ื-GPU caches. ืืืืื ืืืคืืืงืฆืื ืืื ืขืช ืืืจืืขืื ืืืืืกืกืช ืขื webhooks ืืืืกืื ืืืืืืืงืืื S3 ืฉื Mail.ru Cloud Solutions. ืขืจืืฅ ืืืืืจื ืฉืื ื ืขื ืืจื ืกืคืืจืืฆืื ืืืืืืืืช.
ืืงืืจ: www.habr.com