ΠΠ΅Π±Π°Π³ΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° Π±Π°Ρ ΡΠΊΡΠΈΠΏΡΠΈΡΠ΅ Π΅ ΠΊΠ°ΠΊΠΎ Π΄Π° Π±Π°ΡΠ°ΡΠ΅ ΠΈΠ³Π»Π° Π²ΠΎ ΡΡΠΎΠ³ ΡΠ΅Π½ΠΎ, ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΠΊΠΎΠ³Π° ΡΠ΅ ΠΏΠΎΡΠ°Π²ΡΠ²Π°Π°Ρ Π½ΠΎΠ²ΠΈ Π΄ΠΎΠ΄Π°ΡΠΎΡΠΈ Π²ΠΎ ΠΏΠΎΡΡΠΎΠ΅ΡΠΊΠ°ΡΠ° Π±Π°Π·Π° Π½Π° ΠΊΠΎΠ΄ΠΎΠ²ΠΈ Π±Π΅Π· Π½Π°Π²ΡΠ΅ΠΌΠ΅Π½ΠΎ ΡΠ°Π·Π³Π»Π΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΡΠ°ΡΠ°ΡΠ°ΡΠ° Π·Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°, Π΅Π²ΠΈΠ΄Π΅Π½ΡΠΈΡΠ°ΡΠ° ΠΈ Π΄ΠΎΠ²Π΅ΡΠ»ΠΈΠ²ΠΎΡΡΠ°. ΠΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΡΠ΄Π΅ΡΠ΅ Π²ΠΎ ΡΠ°ΠΊΠ²ΠΈ ΡΠΈΡΡΠ°ΡΠΈΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΡΠ°Π΄ΠΈ Π²Π°ΡΠΈ ΡΠΎΠΏΡΡΠ²Π΅Π½ΠΈ Π³ΡΠ΅ΡΠΊΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π° ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠΎ ΡΠ»ΠΎΠΆΠ΅Π½ΠΈ ΠΊΡΠΏΠΈΡΡΠ° ΡΠΊΡΠΈΠΏΡΠΈ.
Π’ΠΈΠΌ
ΠΠΎ Π½Π°ΠΏΠΈΡΠΎΡ, Π°Π²ΡΠΎΡΠΎΡ Π³ΠΎ ΡΠΏΠΎΠ΄Π΅Π»ΡΠ²Π° ΠΎΠ½Π° ΡΡΠΎ Π³ΠΎ Π½Π°ΡΡΠΈΠ» Π²ΠΎ ΡΠ΅ΠΊΠΎΡ Π½Π° ΠΈΠ·ΠΌΠΈΠ½Π°ΡΠΈΡΠ΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡ Π³ΠΎΠ΄ΠΈΠ½ΠΈ, ΠΊΠ°ΠΊΠΎ ΠΈ Π½Π΅ΠΊΠΎΠΈ Π²ΠΎΠΎΠ±ΠΈΡΠ°Π΅Π½ΠΈ Π³ΡΠ΅ΡΠΊΠΈ ΡΡΠΎ Π³ΠΎ ΡΠ°ΡΠΈΠ»Π΅ Π½Π° ΡΡΡΠ°ΠΆΠ°. ΠΠ²Π° Π΅ Π²Π°ΠΆΠ½ΠΎ Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΠ΅ΠΊΠΎΡ ΡΠ°Π·Π²ΠΈΠ²Π°Ρ Π½Π° ΡΠΎΡΡΠ²Π΅Ρ, Π²ΠΎ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΎΠ΄ ΡΠ²ΠΎΡΠ°ΡΠ° ΠΊΠ°ΡΠΈΠ΅ΡΠ°, ΡΠ°Π±ΠΎΡΠΈ ΡΠΎ ΡΠΊΡΠΈΠΏΡΠΈ Π·Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° ΡΡΡΠΈΠ½ΡΠΊΠΈΡΠ΅ ΡΠ°Π±ΠΎΡΠ½ΠΈ Π·Π°Π΄Π°ΡΠΈ.
Π Π°ΠΊΡΠ²Π°ΡΠΈ ΡΠΎ ΡΡΠ°ΠΏΠΈΡΠΈ
ΠΠΎΠ²Π΅ΡΠ΅ΡΠΎ Π±Π°Ρ ΡΠΊΡΠΈΠΏΡΠΈ ΡΡΠΎ ΡΡΠΌ Π³ΠΈ ΡΡΠ΅ΡΠ½Π°Π» Π½ΠΈΠΊΠΎΠ³Π°Ρ Π½Π΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ Π΅ΡΠ΅ΠΊΡΠΈΠ²Π΅Π½ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° ΡΠΈΡΡΠ΅ΡΠ΅ ΠΊΠΎΠ³Π° ΡΠ΅ ΡΠ΅ ΡΠ»ΡΡΠΈ Π½Π΅ΡΡΠΎ Π½Π΅ΠΎΡΠ΅ΠΊΡΠ²Π°Π½ΠΎ Π·Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΈΠ·Π²ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΡΠΊΡΠΈΠΏΡΠ°ΡΠ°.
ΠΠ·Π½Π΅Π½Π°Π΄ΡΠ²Π°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ°Π²Π°Ρ ΠΎΠ΄Π½Π°Π΄Π²ΠΎΡ, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π΅ ΠΏΡΠΈΠΌΠ°ΡΠ΅ΡΠΎ ΡΠΈΠ³Π½Π°Π» ΠΎΠ΄ ΡΠ°Π΄ΡΠΎΡΠΎ. Π Π°ΠΊΡΠ²Π°ΡΠ΅ΡΠΎ ΡΠΎ ΡΠ°ΠΊΠ²ΠΈ ΡΠ»ΡΡΠ°ΠΈ Π΅ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ Π·Π° Π΄Π° ΡΠ΅ ΠΎΡΠΈΠ³ΡΡΠΈ Π΄Π΅ΠΊΠ° ΡΠΊΡΠΈΠΏΡΠΈΡΠ΅ ΡΠ΅ Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ ΡΠΈΠ³ΡΡΠ½ΠΈ Π·Π° Π΄Π° ΠΌΠΎΠΆΠ°Ρ Π΄Π° ΡΠ°Π±ΠΎΡΠ°Ρ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ. Π§Π΅ΡΡΠΎ ΠΊΠΎΡΠΈΡΡΠ°ΠΌ ΡΠΏΡΠ°Π²ΡΠ²Π°ΡΠΈ Π·Π° ΠΈΠ·Π»Π΅Π· Π·Π° Π΄Π° ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ°ΠΌ Π½Π° Π²Π°ΠΊΠ²ΠΈ ΡΡΠ΅Π½Π°ΡΠΈΡΠ°:
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 Π½Π΅ ΡΠ΅ ΡΠ°ΠΌΠΎ Π½ΡΠ»Π° ΠΈΠ»ΠΈ Π΅Π΄Π½Π°, ΡΡΠΊΡ Π½ΡΠ»Π° ΠΈΠ»ΠΈ Π½Π΅-Π½ΡΠ»ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡ. ΠΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π³ΠΈ ΠΎΠ²ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° Π΄Π° Π²ΡΠ°ΡΠΈΡΠ΅ ΡΠΎΠΏΡΡΠ²Π΅Π½ΠΈ ΠΊΠΎΠ΄ΠΎΠ²ΠΈ Π·Π° Π³ΡΠ΅ΡΠΊΠΈ (ΠΏΠΎΠΌΠ΅ΡΡ 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
Π° Π΄ΡΡΠ³ΠΈ, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ ΡΠ΅ ΠΈΠ·Π²Π΅ΡΡΠ°ΠΈΡΠ΅ Π½Π° 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"
ΠΠ²Π° ΠΌΠΈ ΠΏΠΎΠΌΠ°Π³Π° Π΄Π° Π³ΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΡΠ²Π°ΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΡΠΈΡΠ½ΠΈΡΠ΅/Π±Π°Π²Π½ΠΈΡΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΎ ΡΠΊΡΠΈΠΏΡΠΈΡΠ΅ Π½Π° ΠΊΠΎΠΈ ΠΈΠΌ Π΅ ΠΏΠΎΡΡΠ΅Π±Π½Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΠ°.
Π‘ΠΎ ΡΡΠ΅ΡΠ°!
Π¨ΡΠΎ Π΄ΡΡΠ³ΠΎ Π΄Π° ΠΏΡΠΎΡΠΈΡΠ°ΡΠ΅:
ΠΠ΄Π΅ΡΠ΅ ΠΈ ΠΊΠ΅ΡΠΎΡ Π½Π° Π³ΡΠ°ΡΠΈΡΠΊΠΈΠΎΡ ΠΏΡΠΎΡΠ΅ΡΠΎΡ. ΠΡΠΈΠΌΠ΅Ρ Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° ΡΠΏΡΠ°Π²ΡΠ²Π°Π½Π° ΠΎΠ΄ Π½Π°ΡΡΠ°Π½ΠΈ Π±Π°Π·ΠΈΡΠ°Π½Π° Π½Π° Π²Π΅Π±-ΠΊΡΠΊΠΈ Π²ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ΡΠΎ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡΠΈ S3 Π½Π° Mail.ru Cloud Solutions. ΠΠ°ΡΠΈΠΎΡ ΡΠ΅Π»Π΅Π³ΡΠ°ΠΌΡΠΊΠΈ ΠΊΠ°Π½Π°Π» Π·Π° Π΄ΠΈΠ³ΠΈΡΠ°Π»Π½Π° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡΠ°.
ΠΠ·Π²ΠΎΡ: www.habr.com