ΠΡΡΡΡΠ°Π½ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ Π² 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
Π΅ Π²Π³ΡΠ°Π΄Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π² shell, ΠΊΠΎΡΡΠΎ Π²ΠΈ ΠΏΠΎΠΌΠ°Π³Π° Π΄Π° ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ Π·Π° ΠΏΠΎΡΠΈΡΡΠ²Π°Π½Π΅, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π° Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π½ΡΠΊΠ°ΠΊΠ²ΠΈ ΡΠΈΠ³Π½Π°Π»ΠΈ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π²Π° Ρ ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΎΡΠΈ ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡ 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
ΠΠΎΠ΄Π΄ΡΡΠΆΠ°ΠΌ ΠΎΡΠ΄Π΅Π»Π½ΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅, ΠΊΠΎΠ΅ΡΠΎ ΠΌΠΎΠ³Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Π·Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π½ΠΎΠ² ΠΏΡΠΎΠ΅ΠΊΡ/Π±Π°Ρ ΡΠΊΡΠΈΠΏΡ, ΠΊΠΎΠΉΡΠΎ ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡ. ΠΡΠΈΡΠΊΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π° Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΈ Π΄Π° ΡΠ΅ ΠΈΠ·Π²Π»ΠΈΡΠ° ΠΎΡ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΡΠΊΠ°Ρ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ. ΠΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π½Π°ΠΌΠ°Π»ΡΠ²Π° ΡΠ°Π·ΠΌΠ΅ΡΠ° Π½Π° Π΄ΡΡΠ³ΠΈΡΠ΅ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ ΠΈ ΡΡΡΠΎ ΡΠ°ΠΊΠ° Π³Π°ΡΠ°Π½ΡΠΈΡΠ°, ΡΠ΅ ΠΊΠΎΠ΄ΠΎΠ²Π°ΡΠ° Π±Π°Π·Π° Π΅ ΠΌΠ°Π»ΠΊΠ° ΠΈ Π»Π΅ΡΠ½Π° Π·Π° ΡΠ΅ΡΡΠ²Π°Π½Π΅.
ΠΠ°ΠΊΡΠΎ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΠΎ-Π³ΠΎΡΠ΅, Π²ΡΠΈΡΠΊΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½Π΅, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡ __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 ΠΊΠ΅ΡΠΎΠ²Π΅. ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠΏΡΠ°Π²Π»ΡΠ²Π°Π½ΠΎ ΠΎΡ ΡΡΠ±ΠΈΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π±Π°Π·ΠΈΡΠ°Π½ΠΎ Π½Π° ΡΠ΅Π± ΠΊΡΠΊΠΈΡΠΊΠΈ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ S3 Π½Π° Mail.ru Cloud Solutions. ΠΠ°ΡΠΈΡΡ ΡΠ΅Π»Π΅Π³ΡΠ°ΠΌ ΠΊΠ°Π½Π°Π» Π·Π° Π΄ΠΈΠ³ΠΈΡΠ°Π»Π½Π°ΡΠ° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com