ααΆαααααΆααααα α»αααααααΈα 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 ααααα’ααα α αΎααααα»αααΌααααααα’αα»ααΆααααααΆαααααΆααα±ααααααΎααΆα
αααααααΎαααααΌαα ααααααΆαααααα½αααααα’αααα
αααααΌααααα‘αααααα»α 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"
ααΆαα½ααααα»αααααααααα αΆ/ααΊααα αααα»αααααααΈααααααααΌαααΆαααΆααααααΎαααααα·αααααΆαα
ααΌαααααΆαααα’!
ααΎααΆαα’αααΈααααααααααΌαα’αΆαα
αα βαα·αβααααΆααβαααααΆαα GPU α α§ααΆα ααααααααααα·ααΈααααααα»ααααααααΉαααα·ααΆαααααα’ααααΎ webhooks αα αααα»ααααααααααα»αααααα» S3 αα Mail.ru Cloud Solutions α ααα»αααα·αααΌααααααααααΎαα’αααΈααΆαααααΆααααααΌαααΈααΈααα
ααααα: www.habr.com