ΠΡΠ»Π°Π΄ΠΊΠ° ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π² 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
β ΡΡΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ, ΠΏΠΎΠΌΠΎΠ³Π°ΡΡΠ°Ρ Π²Π°ΠΌ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΡΠΈΡΡΠΊΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π² ΡΠ»ΡΡΠ°Π΅ ΠΊΠ°ΠΊΠΈΡ
-Π»ΠΈΠ±ΠΎ ΡΠΈΠ³Π½Π°Π»ΠΎΠ². ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠΎΠ±Π»ΡΠ΄Π°ΡΡ ΠΎΡΠΎΠ±ΡΡ ΠΎΡΡΠΎΡΠΎΠΆΠ½ΠΎΡΡΡ Ρ ΡΠ°ΠΊΠΈΠΌΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌΠΈ, ΠΊΠ°ΠΊ SIGINT
, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΡ.
ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ»ΡΡΠ°Π΅Π² ΡΠ»Π΅Π΄ΡΠ΅Ρ Π»ΠΎΠ²ΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ EXIT
, Π½ΠΎ ΠΈΠ΄Π΅Ρ Π² ΡΠΎΠΌ, ΡΡΠΎ Π²Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠΊΡΠΈΠΏΡΠ° Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π°.
ΠΡΡΡΠΎΠ΅Π½Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ set β Π±ΡΡΡΡΠΎΠ΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΠΎΡΠΈΠ±ΠΊΠ΅
ΠΡΠ΅Π½Ρ Π²Π°ΠΆΠ½ΠΎ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ Π½Π° ΠΎΡΠΈΠ±ΠΊΠΈ, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ½ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ, ΠΈ Π±ΡΡΡΡΠΎ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. ΠΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Ρ ΡΠΆΠ΅, ΡΠ΅ΠΌ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²ΡΠΎΠ΄Π΅ ΡΠ°ΠΊΠΎΠΉ:
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, ΠΈ Ρ Π½Π°ΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ Π΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ²ΠΎΠΈΡ exit-ΠΊΠΎΠ΄ΠΎΠ²
ΠΠΎΠ΄Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° Π² 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)"
ΠΠΎΡΠ»Π΅ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ ΠΎΡΠΈΡΡΠΊΠ° ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½Π° Π² ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°Ρ Π»ΠΎΠ²ΡΡΠ΅ΠΊ, ΠΎΠ±ΡΡΠΆΠ΄Π°Π΅ΠΌΡΡ Π²ΡΡΠ΅. ΠΡΠ»ΠΈ ΠΎΠ± ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΉ Π½Π΅ ΠΏΠΎΠ·Π°Π±ΠΎΡΠΈΡΡΡΡ, ΠΎΠ½ΠΈ Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°ΡΡΡΡ, ΠΈ Π½Π° ΠΊΠ°ΠΊΠΎΠΌ-ΡΠΎ ΡΡΠ°ΠΏΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π½Π° Ρ ΠΎΡΡΠ΅, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΡΠΉ Π΄ΠΈΡΠΊ.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ lock-ΡΠ°ΠΉΠ»ΠΎΠ²
Π§Π°ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΡΡΠ΅Π½Π°ΡΠΈΡ Π½Π° Ρ ΠΎΡΡΠ΅ Π² Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ lock-ΡΠ°ΠΉΠ»ΠΎΠ².
Π― ΠΎΠ±ΡΡΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ lock-ΡΠ°ΠΉΠ»Ρ Π² /tmp/project_name/*.lock
ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡ ΠΈΡ
Π½Π°Π»ΠΈΡΠΈΠ΅ Π² Π½Π°ΡΠ°Π»Π΅ ΡΠΊΡΠΈΠΏΡΠ°. ΠΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ ΡΠΊΡΠΈΠΏΡΠ° ΠΈ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΡ
ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΡ Π΄ΡΡΠ³ΠΈΠΌ ΡΡΠ΅Π½Π°ΡΠΈΠ΅ΠΌ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΌ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ. Lock-ΡΠ°ΠΉΠ»Ρ Π½Π΅ Π½ΡΠΆΠ½Ρ, Π΅ΡΠ»ΠΈ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ, ΡΡΠΎΠ±Ρ ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΡΠΊΡΠΈΠΏΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ»ΡΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ Π½Π° Π΄Π°Π½Π½ΠΎΠΌ Ρ
ΠΎΡΡΠ΅.
ΠΠ·ΠΌΠ΅ΡΠΈΡΡ ΠΈ ΡΠ»ΡΡΡΠΈΡΡ
ΠΠ°ΠΌ ΡΠ°ΡΡΠΎ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎ ΡΡΠ΅Π½Π°ΡΠΈΡΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠΈΠΎΠ΄Π° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΅ΠΆΠ΅Π΄Π½Π΅Π²Π½ΡΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠΌΠΈ Ρ Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½ΡΡ . Π’Π°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΠ±ΡΡΠ½ΠΎ Π²ΠΊΠ»ΡΡΠ°ΡΡ Π² ΡΠ΅Π±Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΡΠ°Π³ΠΎΠ²: Π·Π°Π³ΡΡΠ·ΠΊΠ° Π΄Π°Π½Π½ΡΡ , ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅ Π°Π½ΠΎΠΌΠ°Π»ΠΈΠΉ, ΠΈΠΌΠΏΠΎΡΡ Π΄Π°Π½Π½ΡΡ , ΠΎΡΠΏΡΠ°Π²ΠΊΠ° ΠΎΡΡΠ΅ΡΠΎΠ² ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅.
Π ΡΠ°ΠΊΠΈΡ ΡΠ»ΡΡΠ°ΡΡ Ρ Π²ΡΠ΅Π³Π΄Π° ΡΡΠ°ΡΠ°ΡΡΡ ΡΠ°Π·Π±ΠΈΠ²Π°ΡΡ ΡΡΠ΅Π½Π°ΡΠΈΠΉ Π½Π° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΠ΅ ΡΠΊΡΠΈΠΏΡΡ ΠΈ ΡΠΎΠΎΠ±ΡΠ°ΡΡ ΠΎΠ± ΠΈΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ:
time source "${filepath}" "${args}">> "${LOG_DIR}/RUN_LOG" 2>&1
ΠΠΎΠ·ΠΆΠ΅ Ρ ΠΌΠΎΠ³Ρ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ:
tac "${LOG_DIR}/RUN_LOG.txt" | grep -m1 "real"
ΠΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΌΠ½Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΡΠ΅/ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ Π² ΡΠΊΡΠΈΠΏΡΠ°Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΡΠΆΠ΄Π°ΡΡΡΡ Π² ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ.
Π£Π΄Π°ΡΠΈ!
Π§ΡΠΎ Π΅ΡΠ΅ ΠΏΠΎΡΠΈΡΠ°ΡΡ:
Go ΠΈ ΠΊΠ΅ΡΠΈ GPU. ΠΡΠΈΠΌΠ΅Ρ event-driven ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π²Π΅Π±Ρ ΡΠΊΠΎΠ² Π² ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠΌ S3-Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Mail.ru Cloud Solutions. ΠΠ°Ρ ΡΠ΅Π»Π΅Π³ΡΠ°ΠΌ-ΠΊΠ°Π½Π°Π» ΠΎ ΡΠΈΡΡΠΎΠ²ΠΎΠΉ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΠΈ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com