Най-Π΄ΠΎΠ±Ρ€ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ Π·Π° Bash скриптовС: Π‘ΡŠΡ€Π·ΠΎ Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ Π·Π° Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΈ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π½ΠΈ Bash скриптовС

Най-Π΄ΠΎΠ±Ρ€ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ Π·Π° Bash скриптовС: Π‘ΡŠΡ€Π·ΠΎ Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ Π·Π° Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΈ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π½ΠΈ Bash скриптовС
Shell Ρ‚Π°ΠΏΠ΅Ρ‚ ΠΎΡ‚ manapi

ΠžΡ‚ΡΡ‚Ρ€Π°Π½ΡΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π² bash скриптовС Π΅ ΠΊΠ°Ρ‚ΠΎ Ρ‚ΡŠΡ€ΡΠ΅Π½Π΅ Π½Π° ΠΈΠ³Π»Π° Π² ΠΊΡƒΠΏΠ° сСно, особСно ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС появят Π½ΠΎΠ²ΠΈ допълнСния Π² ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰Π°Ρ‚Π° ΠΊΠΎΠ΄ΠΎΠ²Π° Π±Π°Π·Π° Π±Π΅Π· своСврСмСнно Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅ Π½Π° структурата, рСгистриранСто ΠΈ надСТдността. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΠΎΠΏΠ°Π΄Π½Π΅Ρ‚Π΅ Π² Ρ‚Π°ΠΊΠΈΠ²Π° ситуации ΠΏΠΎΡ€Π°Π΄ΠΈ собствСни Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π°Ρ‚ΠΎ управляватС слоТни ΠΊΡƒΠΏΡ‡ΠΈΠ½ΠΈ скриптовС.

ΠžΡ‚Π±ΠΎΡ€ ΠžΠ±Π»Π°Ρ‡Π½ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π½Π° Mail.ru ΠΏΡ€Π΅Π²Π΅Π΄Π΅ статия с ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΠΊΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π°Ρ‚ Π΄Π° ΠΏΠΈΡˆΠ΅Ρ‚Π΅, отстраняватС Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΈ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚Π΅ ΠΏΠΎ-Π΄ΠΎΠ±Ρ€Π΅ Π²Π°ΡˆΠΈΡ‚Π΅ скриптовС. ВярватС ΠΈΠ»ΠΈ Π½Π΅, Π½ΠΈΡ‰ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС сравни с удоволствиСто ΠΎΡ‚ писанСто Π½Π° чист, Π³ΠΎΡ‚ΠΎΠ² Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ 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 ΠΊΠΎΠ΄ спрямо Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΈΡ‚Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ.

Използвам Π³ΠΎ Π² ΠΌΠΎΠΈΡ‚Π΅ Π»ΠΎΠΊΠ°Π»Π½ΠΈ срСди Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, Π·Π° Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌ ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΈ Π·Π° синтаксис, сСмантика ΠΈ някои Π³Ρ€Π΅ΡˆΠΊΠΈ Π² ΠΊΠΎΠ΄Π°, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° съм пропуснал ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π°. Π’ΠΎΠ²Π° Π΅ инструмСнт Π·Π° статичСн Π°Π½Π°Π»ΠΈΠ· Π½Π° Π²Π°ΡˆΠΈΡ‚Π΅ 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"

Π’ΠΎΠ²Π° ΠΌΠΈ ΠΏΠΎΠΌΠ°Π³Π° Π΄Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΈ/Π±Π°Π²Π½ΠΈ области Π² скриптовС, ΠΊΠΎΠΈΡ‚ΠΎ сС нуТдаят ΠΎΡ‚ оптимизация.

На Π΄ΠΎΠ±ΡŠΡ€ час!

Какво Π΄Ρ€ΡƒΠ³ΠΎ Π΄Π° ΠΏΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅:

  1. Go и GPU кСшовС.
  2. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° управлявано ΠΎΡ‚ ΡΡŠΠ±ΠΈΡ‚ΠΈΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π±Π°Π·ΠΈΡ€Π°Π½ΠΎ Π½Π° ΡƒΠ΅Π± ΠΊΡƒΠΊΠΈΡ‡ΠΊΠΈ Π² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ S3 Π½Π° Mail.ru Cloud Solutions.
  3. ΠΠ°ΡˆΠΈΡΡ‚ Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ ΠΊΠ°Π½Π°Π» Π·Π° Π΄ΠΈΠ³ΠΈΡ‚Π°Π»Π½Π°Ρ‚Π° трансформация.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€