ืฉื™ื˜ื•ืช ืžื•ืžืœืฆื•ืช ืœ-Bash Scripting: ืžื“ืจื™ืš ืžื”ื™ืจ ืœืชืกืจื™ื˜ื™ Bash ืืžื™ื ื™ื ื•ื‘ื™ืฆื•ืขื™ื™ื

ืฉื™ื˜ื•ืช ืžื•ืžืœืฆื•ืช ืœ-Bash Scripting: ืžื“ืจื™ืš ืžื”ื™ืจ ืœืชืกืจื™ื˜ื™ Bash ืืžื™ื ื™ื ื•ื‘ื™ืฆื•ืขื™ื™ื
ื˜ืคื˜ ืžืขื˜ืคืช ืžืืช manapi

ืื™ืชื•ืจ ื‘ืื’ื™ื ื‘ืกืงืจื™ืคื˜ื™ื ืฉืœ bash ื”ื•ื ื›ืžื• ืœื—ืคืฉ ืžื—ื˜ ื‘ืขืจื™ืžืช ืฉื—ืช, ื‘ืžื™ื•ื—ื“ ื›ืืฉืจ ืชื•ืกืคื•ืช ื—ื“ืฉื•ืช ืžื•ืคื™ืขื•ืช ื‘ื‘ืกื™ืก ื”ืงื•ื“ ื”ืงื™ื™ื ืœืœื ื”ืชื—ืฉื‘ื•ืช ื‘ื–ืžืŸ ื‘ื‘ืขื™ื•ืช ืฉืœ ืžื‘ื ื”, ืจื™ืฉื•ื ื•ืืžื™ื ื•ืช. ืืชื” ื™ื›ื•ืœ ืœืžืฆื•ื ืืช ืขืฆืžืš ื‘ืžืฆื‘ื™ื ื›ืืœื” ืื• ื‘ื’ืœืœ ื”ื˜ืขื•ื™ื•ืช ืฉืœืš ืื• ื‘ืขืช ื ื™ื”ื•ืœ ืขืจื™ืžื•ืช ืžื•ืจื›ื‘ื•ืช ืฉืœ ืกืงืจื™ืคื˜ื™ื.

ืงื‘ื•ืฆื” ืคืชืจื•ื ื•ืช ืขื ืŸ ืฉืœ Mail.ru ืชืจื’ื ืžืืžืจ ืขื ื”ืžืœืฆื•ืช ืฉื™ืขื–ืจื• ืœืš ืœื›ืชื•ื‘, ืœื ืคื•ืช ื‘ืื’ื™ื ื•ืœืชื—ื–ืง ืืช ื”ืชืกืจื™ื˜ื™ื ืฉืœืš ื‘ืฆื•ืจื” ื˜ื•ื‘ื” ื™ื•ืชืจ. ืชืืžื™ื ื• ืื• ืœื, ืฉื•ื ื“ื‘ืจ ืœื ืžื ืฆื— ืืช ื”ืกื™ืคื•ืง ืฉืœ ื›ืชื™ื‘ืช ืงื•ื“ 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 ื›ื“ื™ ืœื–ื”ื•ืช ืฉื’ื™ืื•ืช ื‘ืžื”ืœืš ื”ืคื™ืชื•ื—

ื›ื“ืื™ ืœืฉืœื‘ ืžืฉื”ื• ื›ืžื• 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, ื›ืืฉืจ ืžืฉืชื ื™ ืœื•ื’ืจ ื›ืืœื” ื•ืžืฉืชื ื™ ืžืขืจื›ืช ืื—ืจื™ื ืžืื•ืชื—ืœื™ื ืื• ืžื•ื’ื“ืจื™ื ืœืขืจื›ื™ ื‘ืจื™ืจืช ืžื—ื“ืœ. ื ื™ืชืŸ ืœื”ื’ื“ื™ืจ ืžืฉืชื ื™ื ืืœื” ื’ื ืžืชื•ืš ืืคืฉืจื•ื™ื•ืช ืฉื•ืจืช ื”ืคืงื•ื“ื” ื‘ืžื”ืœืš ื”ืคืขืœืช ืกืงืจื™ืคื˜.

ืœื“ื•ื’ืžื”, ืžืฉื”ื• ื›ืžื•:

$ ./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. Go ื•-GPU caches.
  2. ื“ื•ื’ืžื” ืœืืคืœื™ืงืฆื™ื” ืžื•ื ืขืช ืื™ืจื•ืขื™ื ื”ืžื‘ื•ืกืกืช ืขืœ webhooks ื‘ืื—ืกื•ืŸ ื”ืื•ื‘ื™ื™ืงื˜ื™ื S3 ืฉืœ Mail.ru Cloud Solutions.
  3. ืขืจื•ืฅ ื”ื˜ืœื’ืจื ืฉืœื ื• ืขืœ ื˜ืจื ืกืคื•ืจืžืฆื™ื” ื“ื™ื’ื™ื˜ืœื™ืช.

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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”