рдмреЕрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рд╕рд░реНрд╡реЛрддреНрддрдо рдкрджреНрдзрддреА: рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣ рдЖрдгрд┐ рдХрд╛рд░реНрдпрдХреНрд╖рдо рдмреЕрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕рд╕рд╛рдареА рдПрдХ рджреНрд░реБрдд рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ

рдмреЕрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рд╕рд░реНрд╡реЛрддреНрддрдо рдкрджреНрдзрддреА: рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣ рдЖрдгрд┐ рдХрд╛рд░реНрдпрдХреНрд╖рдо рдмреЕрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕рд╕рд╛рдареА рдПрдХ рджреНрд░реБрдд рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ
рдордирд╛рдкреА рджреНрд╡рд╛рд░реЗ рд╢реЗрд▓ рд╡реЙрд▓рдкреЗрдкрд░

рдмреЕрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдбреАрдмрдЧ рдХрд░рдгреЗ рд╣реЗ рдЧрд╡рддрд╛рдЪреНрдпрд╛ рдЧрдВрдЬреАрдордзреНрдпреЗ рд╕реБрдИ рд╢реЛрдзрдгреНрдпрд╛рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗ, рд╡рд┐рд╢реЗрд╖рдд: рдЬреЗрд╡реНрд╣рд╛ рд╕рдВрд░рдЪрдирд╛, рд▓реЙрдЧрд┐рдВрдЧ рдЖрдгрд┐ рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣рддреЗрдЪреНрдпрд╛ рдореБрджреНрджреНрдпрд╛рдВрдЪрд╛ рд╡реЗрд│реЗрд╡рд░ рд╡рд┐рдЪрд╛рд░ рди рдХрд░рддрд╛ рд╡рд┐рджреНрдпрдорд╛рди рдХреЛрдбрдмреЗрд╕рдордзреНрдпреЗ рдирд╡реАрди рдЬреЛрдбрдгреА рджрд┐рд╕реВрди рдпреЗрддрд╛рдд. рддреБрдордЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рдЪреБрдХрд╛рдВрдореБрд│реЗ рдХрд┐рдВрд╡рд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдЪреЗ рдЬрдЯрд┐рд▓ рдврд┐рдЧрд╛рд░реЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛рдирд╛ рддреБрдореНрд╣реА рдЕрд╢рд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрдд рд╕реНрд╡рддрдГрд▓рд╛ рд╢реЛрдзреВ рд╢рдХрддрд╛.

рд╕рдВрдШ 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 рдордзреАрд▓ рд░рд┐рдЯрд░реНрди рдХреЛрдб рд╣реЗ рдлрдХреНрдд рд╢реВрдиреНрдп рдХрд┐рдВрд╡рд╛ рдПрдХ рдирд╕реВрди рд╢реВрдиреНрдп рдХрд┐рдВрд╡рд╛ рд╢реВрдиреНрдп рдирд╕рд▓реЗрд▓реЗ рдореВрд▓реНрдп рдЖрд╣реЗ. рд╡рд┐рд╡рд┐рдз рддреНрд░реБрдЯреА рдкреНрд░рдХрд░рдгрд╛рдВрд╕рд╛рдареА рд╕рд╛рдиреБрдХреВрд▓ рддреНрд░реБрдЯреА рдХреЛрдб (реирежрез-реирелрек рджрд░рдореНрдпрд╛рди) рдкрд░рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдпрд╛ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░рд╛.

рд╣реА рдорд╛рд╣рд┐рддреА рдирдВрддрд░ рдЗрддрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯрджреНрд╡рд╛рд░реЗ рд╡рд╛рдкрд░рд▓реА рдЬрд╛рдК рд╢рдХрддреЗ рдЬреА рддреБрдореНрд╣рд╛рд▓рд╛ рдиреЗрдордХреА рдХреЛрдгрддреНрдпрд╛ рдкреНрд░рдХрд╛рд░рдЪреА рддреНрд░реБрдЯреА рдЖрд▓реА рд╣реЗ рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рддреНрдпрд╛рдиреБрд╕рд╛рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддрд╛рдд:

#!/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. рдЬрд╛ рдЖрдгрд┐ GPU рдХреЕрд╢реЗ.
  2. Mail.ru рдХреНрд▓рд╛рдЙрдб рд╕реЛрд▓реНрдпреВрд╢рдиреНрд╕рдЪреНрдпрд╛ S3 рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдЯреЛрд░реЗрдЬрдордзреАрд▓ рд╡реЗрдмрд╣реБрдХрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЗрд╡реНрд╣реЗрдВрдЯ-рдЪрд╛рд▓рд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдЪреЗ рдЙрджрд╛рд╣рд░рдг.
  3. рдбрд┐рдЬрд┐рдЯрд▓ рдкрд░рд┐рд╡рд░реНрддрдирд╛рдмрджреНрджрд▓ рдЖрдордЪреЗ рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдЪреЕрдиреЗрд▓.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛