ΠΠ°Ρ˜Π΄ΠΎΠ±Ρ€ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ Π·Π° ΡΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°ΡšΠ΅ Bash: Π‘Ρ€Π· Π²ΠΎΠ΄ΠΈΡ‡ Π·Π° сигурни ΠΈ пСрформанси Bash скрипти

ΠΠ°Ρ˜Π΄ΠΎΠ±Ρ€ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ Π·Π° ΡΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°ΡšΠ΅ Bash: Π‘Ρ€Π· Π²ΠΎΠ΄ΠΈΡ‡ Π·Π° сигурни ΠΈ пСрформанси Bash скрипти
Π’Π°ΠΏΠ΅Ρ‚ Π½Π° школка ΠΎΠ΄ ΠΌΠ°Π½Π°ΠΏΠΈ

Π”Π΅Π±Π°Π³ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° баш скриптитС Π΅ ΠΊΠ°ΠΊΠΎ Π΄Π° Π±Π°Ρ€Π°Ρ‚Π΅ ΠΈΠ³Π»Π° Π²ΠΎ стог сСно, особСно ΠΊΠΎΠ³Π° сС ΠΏΠΎΡ˜Π°Π²ΡƒΠ²Π°Π°Ρ‚ Π½ΠΎΠ²ΠΈ Π΄ΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π²ΠΎ постоСчката Π±Π°Π·Π° Π½Π° ΠΊΠΎΠ΄ΠΎΠ²ΠΈ Π±Π΅Π· Π½Π°Π²Ρ€Π΅ΠΌΠ΅Π½ΠΎ Ρ€Π°Π·Π³Π»Π΅Π΄ΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΏΡ€Π°ΡˆΠ°ΡšΠ°Ρ‚Π° Π·Π° структурата, Π΅Π²ΠΈΠ΄Π΅Π½Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΈ довСрливоста. МоТС Π΄Π° сС Π½Π°Ρ˜Π΄Π΅Ρ‚Π΅ Π²ΠΎ Ρ‚Π°ΠΊΠ²ΠΈ ситуации ΠΈΠ»ΠΈ ΠΏΠΎΡ€Π°Π΄ΠΈ ваши сопствСни Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π° ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Ρ‚Π΅ со слоТСни ΠΊΡƒΠΏΠΈΡˆΡ‚Π° скрипти.

Π’ΠΈΠΌ Mail.ru Cloud Solutions ΠΏΡ€Π΅Π²Π΅Π΄Π΅ ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° со ΠΏΡ€Π΅ΠΏΠΎΡ€Π°ΠΊΠΈ ΠΊΠΎΠΈ ќС Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ‚ Π΄Π° ΠΏΠΈΡˆΡƒΠ²Π°Ρ‚Π΅, Π΄Π΅Π±Π°Π³ΠΈΡ€Π°Ρ‚Π΅ ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΎ Π΄Π° Π³ΠΈ ΠΎΠ΄Ρ€ΠΆΡƒΠ²Π°Ρ‚Π΅ Π²Π°ΡˆΠΈΡ‚Π΅ скрипти. Π’Π΅Ρ€ΡƒΠ²Π°Π»Π΅ ΠΈΠ»ΠΈ Π½Π΅, Π½ΠΈΡˆΡ‚ΠΎ Π½Π΅ Π³ΠΎ Π½Π°Π΄ΠΌΠΈΠ½ΡƒΠ²Π° задоволството ΠΎΠ΄ ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ чист, ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²Π΅Π½ Π·Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° баш-ΠΊΠΎΠ΄ кој Ρ€Π°Π±ΠΎΡ‚ΠΈ сСкој ΠΏΠ°Ρ‚.

Π’ΠΎ написот, Π°Π²Ρ‚ΠΎΡ€ΠΎΡ‚ Π³ΠΎ сподСлува ΠΎΠ½Π° ΡˆΡ‚ΠΎ Π³ΠΎ Π½Π°ΡƒΡ‡ΠΈΠ» Π²ΠΎ Ρ‚Π΅ΠΊΠΎΡ‚ Π½Π° ΠΈΠ·ΠΌΠΈΠ½Π°Ρ‚ΠΈΡ‚Π΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π³ΠΎΠ΄ΠΈΠ½ΠΈ, ΠΊΠ°ΠΊΠΎ ΠΈ Π½Π΅ΠΊΠΎΠΈ Π²ΠΎΠΎΠ±ΠΈΡ‡Π°Π΅Π½ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ ΡˆΡ‚ΠΎ Π³ΠΎ Ρ„Π°Ρ‚ΠΈΠ»Π΅ Π½Π° страТа. Ова Π΅ Π²Π°ΠΆΠ½ΠΎ бидСјќи сСкој Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‡ Π½Π° софтвСр, Π²ΠΎ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΎΠ΄ ΡΠ²ΠΎΡ˜Π°Ρ‚Π° ΠΊΠ°Ρ€ΠΈΠ΅Ρ€Π°, Ρ€Π°Π±ΠΎΡ‚ΠΈ со скрипти Π·Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°ΡšΠ΅ Π½Π° рутинскитС Ρ€Π°Π±ΠΎΡ‚Π½ΠΈ Π·Π°Π΄Π°Ρ‡ΠΈ.

Π Π°ΠΊΡƒΠ²Π°Ρ‡ΠΈ со стапици

ΠŸΠΎΠ²Π΅ΡœΠ΅Ρ‚ΠΎ баш скрипти ΡˆΡ‚ΠΎ сум Π³ΠΈ срСтнал никогаш Π½Π΅ користат Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π΅Π½ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° Ρ‡ΠΈΡΡ‚Π΅ΡšΠ΅ ΠΊΠΎΠ³Π° ќС сС случи Π½Π΅ΡˆΡ‚ΠΎ Π½Π΅ΠΎΡ‡Π΅ΠΊΡƒΠ²Π°Π½ΠΎ Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° скриптата.

Π˜Π·Π½Π΅Π½Π°Π΄ΡƒΠ²Π°ΡšΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΠΎΡ˜Π°Π²Π°Ρ‚ ΠΎΠ΄Π½Π°Π΄Π²ΠΎΡ€, ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ Π΅ ΠΏΡ€ΠΈΠΌΠ°ΡšΠ΅Ρ‚ΠΎ сигнал ΠΎΠ΄ Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ. Π Π°ΠΊΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ со Ρ‚Π°ΠΊΠ²ΠΈ случаи Π΅ исклучитСлно Π²Π°ΠΆΠ½ΠΎ Π·Π° Π΄Π° сС осигури Π΄Π΅ΠΊΠ° скриптитС сС Π΄ΠΎΠ²ΠΎΠ»Π½ΠΎ сигурни Π·Π° Π΄Π° ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ Π½Π° систСми Π·Π° производство. ЧСсто користам ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Ρ‡ΠΈ Π·Π° ΠΈΠ·Π»Π΅Π· Π·Π° Π΄Π° ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€Π°ΠΌ Π½Π° Π²Π°ΠΊΠ²ΠΈ ΡΡ†Π΅Π½Π°Ρ€ΠΈΡ˜Π°:

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 Π·Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°ΡšΠ΅ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π·Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π·Π²ΠΎΡ˜ΠΎΡ‚

Π’Ρ€Π΅Π΄ΠΈ Π΄Π° сС ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π° Π½Π΅ΡˆΡ‚ΠΎ ΠΊΠ°ΠΊΠΎ 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"

Ова ΠΌΠΈ ΠΏΠΎΠΌΠ°Π³Π° Π΄Π° Π³ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΡƒΠ²Π°ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΈΡ‚Π΅/Π±Π°Π²Π½ΠΈΡ‚Π΅ области Π²ΠΎ скриптитС Π½Π° ΠΊΠΎΠΈ ΠΈΠΌ Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ˜Π°.

Π‘ΠΎ ΡΡ€Π΅ΡœΠ°!

Π¨Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎ Π΄Π° ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚Π΅:

  1. ΠžΠ΄Π΅Ρ‚Π΅ ΠΈ ΠΊΠ΅ΡˆΠΎΡ‚ Π½Π° Π³Ρ€Π°Ρ„ΠΈΡ‡ΠΊΠΈΠΎΡ‚ процСсор.
  2. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Π½Π° ΠΎΠ΄ настани Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° Π²Π΅Π±-ΠΊΡƒΠΊΠΈ Π²ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅Ρ‚ΠΎ Π½Π° ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ΠΈ S3 Π½Π° Mail.ru Cloud Solutions.
  3. ΠΠ°ΡˆΠΈΠΎΡ‚ тСлСграмски ΠΊΠ°Π½Π°Π» Π·Π° Π΄ΠΈΠ³ΠΈΡ‚Π°Π»Π½Π° Ρ‚Ρ€Π°Π½ΡΡ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ˜Π°.

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€