Bash / Эцсийн төсөл

Эцсийн төсөл

Баяр хүргэе! Та Bash-н үндэс, хувьсагч, нөхцөл, давталт, функц, файл үйлдлүүд, pipe, grep, sed, awk, process удирдлага, cron, debug, шилдэг дадлага, сүлжээний команд, автоматжуулалт — бүгдийг дамжлаа. Одоо энэ мэдлэгийг нэгтгэх цаг боллоо.

Эцсийн төсөл нь syskit — системийн хэрэгслийн цуглуулга юм. Нэг script-с нөөцлөлт, хяналт, цэвэрлэгээ, мэдэгдэл бүгдийг хийдэг.

Төслийн бүтэц

код
syskit/
├── syskit.sh          ← Үндсэн script (entry point)
├── lib/
│   ├── backup.sh      ← Нөөцлөлтийн функцүүд
│   ├── monitor.sh     ← Хяналтын функцүүд
│   └── utils.sh       ← Нийтлэг туслах функцүүд
├── config/
│   └── syskit.conf    ← Тохируулгын файл
└── logs/
    └── .gitkeep

Директор үүсгэх:

bash
mkdir -p syskit/{lib,config,logs}
touch syskit/logs/.gitkeep

Тохируулгын файл

config/syskit.conf — бүх тохируулгыг нэг газар хадгална:

bash
# syskit.conf — Syskit тохируулга

# Нөөцлөлт
BACKUP_SOURCE="$HOME/Documents"
BACKUP_DEST="$HOME/Backups"
BACKUP_KEEP_DAYS=14

# Хяналт
CPU_WARN_THRESHOLD=75
RAM_WARN_THRESHOLD=80
DISK_WARN_THRESHOLD=85

# Log
LOG_DIR="./logs"
LOG_LEVEL="INFO"   # DEBUG | INFO | WARN | ERROR

# Мэдэгдэл (хоосон бол идэвхгүй)
NOTIFY_EMAIL=""

Туслах функцүүд (lib/utils.sh)

bash
#!/bin/bash
# lib/utils.sh — Нийтлэг туслах функцүүд

readonly COLOR_GREEN='\033[0;32m'
readonly COLOR_YELLOW='\033[1;33m'
readonly COLOR_RED='\033[0;31m'
readonly COLOR_RESET='\033[0m'

log_debug() { [[ "${LOG_LEVEL:-INFO}" == "DEBUG" ]] && echo "[DEBUG] $*"; }
log_info()  { echo -e "${COLOR_GREEN}[INFO]${COLOR_RESET}  $*"; }
log_warn()  { echo -e "${COLOR_YELLOW}[WARN]${COLOR_RESET}  $*" >&2; }
log_error() { echo -e "${COLOR_RED}[ERROR]${COLOR_RESET} $*" >&2; }

require_command() {
  local cmd="$1"
  if ! command -v "$cmd" &>/dev/null; then
    log_error "Шаардлагатай команд олдсонгүй: $cmd"
    exit 1
  fi
}

confirm() {
  local prompt="${1:-Үргэлжлүүлэх үү?}"
  read -r -p "$prompt [y/N] " answer
  [[ "${answer,,}" == "y" ]]
}

format_bytes() {
  local bytes="$1"
  if   (( bytes >= 1073741824 )); then printf "%.1f GB" "$(echo "scale=1; $bytes/1073741824" | bc)"
  elif (( bytes >= 1048576    )); then printf "%.1f MB" "$(echo "scale=1; $bytes/1048576"    | bc)"
  else                                 printf "%d KB"   "$(( bytes / 1024 ))"
  fi
}

Нөөцлөлтийн модуль (lib/backup.sh)

bash
#!/bin/bash
# lib/backup.sh — Нөөцлөлтийн функцүүд

run_backup() {
  local source="${BACKUP_SOURCE:?BACKUP_SOURCE тохируулаагүй байна}"
  local dest="${BACKUP_DEST:?BACKUP_DEST тохируулаагүй байна}"
  local timestamp
  timestamp=$(date +%Y-%m-%d_%H%M%S)
  local archive="$dest/backup_$timestamp.tar.gz"

  log_info "Нөөцлөлт эхэлж байна: $source"
  mkdir -p "$dest"

  if tar -czf "$archive" -C "$(dirname "$source")" "$(basename "$source")" 2>/dev/null; then
    local size
    size=$(du -sh "$archive" | cut -f1)
    log_info "Нөөцлөлт амжилттай: $archive ($size)"
  else
    log_error "Нөөцлөлт амжилтгүй болов"
    return 1
  fi

  # Хуучин нөөцлөлт цэвэрлэх
  local removed=0
  while IFS= read -r -d '' old; do
    rm -f "$old"
    (( removed++ )) || true
  done < <(find "$dest" -name "backup_*.tar.gz" \
              -mtime +"${BACKUP_KEEP_DAYS:-14}" -print0 2>/dev/null)

  (( removed > 0 )) && log_info "$removed хуучин нөөцлөлт устгагдлаа"
}

list_backups() {
  local dest="${BACKUP_DEST:?}"
  log_info "Хадгалагдсан нөөцлөлтүүд ($dest):"
  find "$dest" -name "backup_*.tar.gz" -printf "%T@ %p\n" 2>/dev/null \
    | sort -rn \
    | head -10 \
    | while read -r _ file; do
        local size
        size=$(du -sh "$file" | cut -f1)
        echo "  • $(basename "$file")  [$size]"
      done
}

Үндсэн script (syskit.sh)

bash
#!/bin/bash
set -euo pipefail

readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
readonly CONFIG_FILE="$SCRIPT_DIR/config/syskit.conf"

# Тохируулга болон сангуудыг ачаалах
if [[ -f "$CONFIG_FILE" ]]; then
  # shellcheck source=/dev/null
  source "$CONFIG_FILE"
fi

source "$SCRIPT_DIR/lib/utils.sh"
source "$SCRIPT_DIR/lib/backup.sh"

show_help() {
  cat << 'EOF'
syskit — Системийн хэрэгслийн цуглуулга

Хэрэглээ:
  ./syskit.sh <команд>

Командууд:
  backup    — Файлуудыг нөөцлөх
  backups   — Нөөцлөлтийн жагсаалт харах
  monitor   — Системийн байдал шалгах
  clean     — Log файл цэвэрлэх
  help      — Энэ тусламжийг харуулах
EOF
}

cmd_monitor() {
  local cpu ram disk

  cpu=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'.' -f1)
  ram=$(free | awk '/^Mem:/ {printf "%.0f", $3/$2 * 100}')
  disk=$(df -h / | awk 'NR==2 {print $5}' | tr -d '%')

  echo ""
  echo "╔══════════════════════════════╗"
  echo "║    Системийн байдал          ║"
  echo "╠══════════════════════════════╣"
  printf "║  CPU:   %3d%%                 ║\n" "$cpu"
  printf "║  RAM:   %3d%%                 ║\n" "$ram"
  printf "║  Disk:  %3d%%                 ║\n" "$disk"
  echo "╚══════════════════════════════╝"

  local warned=false
  [[ "$cpu"  -gt "${CPU_WARN_THRESHOLD:-75}"  ]] && { log_warn "CPU ачаалал өндөр!";  warned=true; }
  [[ "$ram"  -gt "${RAM_WARN_THRESHOLD:-80}"  ]] && { log_warn "RAM ашиглалт өндөр!"; warned=true; }
  [[ "$disk" -gt "${DISK_WARN_THRESHOLD:-85}" ]] && { log_warn "Disk дүүрч байна!";   warned=true; }

  "$warned" || log_info "Систем хэвийн ажиллаж байна ✓"
}

cmd_clean() {
  local log_dir="${LOG_DIR:-$SCRIPT_DIR/logs}"
  log_info "Log файлуудыг цэвэрлэж байна..."

  local count=0
  while IFS= read -r -d '' f; do
    rm -f "$f"
    (( count++ )) || true
  done < <(find "$log_dir" -name "*.log" -mtime +7 -print0 2>/dev/null)

  log_info "${count:-0} хуучин log устгагдлаа"
}

# Үндсэн командыг боловсруулах
case "${1:-help}" in
  backup)  run_backup   ;;
  backups) list_backups ;;
  monitor) cmd_monitor  ;;
  clean)   cmd_clean    ;;
  help|*)  show_help    ;;
esac

Ажиллуулах:

bash
chmod +x syskit.sh
./syskit.sh help
./syskit.sh monitor
./syskit.sh backup
./syskit.sh backups

Чамд байна!

Та энэ курсыг дуусгасан хөгжүүлэгч одоо:

  • Terminal-д итгэлтэйгээр ажиллана
  • Давтагдах ажлыг script болгон автоматжуулна
  • Сервер, систем, файлуудаа командын мөрөөс удирдана
  • Shellcheck ашиглан найдвартай, цэвэр код бичнэ
  • Алсын серверт SSH-аар холбогдон ажиллана

Дараагийн алхам болгон Go, Python эсвэл PostgreSQL курсыг авч үзэхийг зөвлөж байна — Bash-н мэдлэг тэдгээрт маш их тус болно. Амжилт хүсье!