рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕: рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд╡рд░рд┐рдд рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛

рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯрд┐рдВрдЧ рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕: рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд╡рд░рд┐рдд рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛
рдордирд╛рдкреА рджреНрд╡рд╛рд░рд╛ рд╢реИрд▓ рд╡реЙрд▓рдкреЗрдкрд░

рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдбрд┐рдмрдЧ рдХрд░рдирд╛ рднреВрд╕реЗ рдХреЗ рдвреЗрд░ рдореЗрдВ рд╕реБрдИ рдвреВрдВрдврдиреЗ рдЬреИрд╕рд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕рдВрд░рдЪрдирд╛, рд▓реЙрдЧрд┐рдВрдЧ рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рдореБрджреНрджреЛрдВ рдкрд░ рд╕рдордп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛ рдореМрдЬреВрджрд╛ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдирдП рдЬреЛрдбрд╝ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдЖрдк рдпрд╛ рддреЛ рдЕрдкрдиреА рдЧрд▓рддрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рдпрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЬрдЯрд┐рд▓ рдвреЗрд░ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреЗ рд╕рдордп рдЦреБрдж рдХреЛ рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЯреАрдо 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

рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдирд╛ рдЖрдкрдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рднреА рдХрдорд╛рдВрдб рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рд╡рдзрд╛рди рд░рд╣рдиреЗ рдФрд░ рдЖрдкрдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рддреНрд░реБрдЯрд┐ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИред

рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЗрд▓рдЪреЗрдХ

рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИ рд╢реЗрд▓рдЪреЗрдХ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдЕрдкрдиреЗ рдмреИрд╢ рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдореЗрдВред

рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдХрд╛рд╕ рдкрд░рд┐рд╡реЗрд╢реЛрдВ рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕, рд╢рдмреНрджрд╛рд░реНрде рдФрд░ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдкрд░ рд░рд┐рдкреЛрд░реНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдореБрдЭрд╕реЗ рдЫреВрдЯ рдЧрдИ рдереАрдВред рдпрд╣ рдЖрдкрдХреА рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдг рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВред

рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдирд┐рдХрд╛рд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

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

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ