Bash / Автоматжуулалтын жишээ

Автоматжуулалтын жишээ

Bash сурсан бүх зүйлийг одоо бодит ажилд хэрэглэх цаг боллоо. Энэ хичээлд хөгжүүлэгчид өдөр бүр тулгардаг асуудлуудыг шийдэх дөрвөн бүтэн script бичнэ. Эдгээр жишээнүүдийг шууд ажлаа дээр хэрэглэж болно.

Файл нөөцлөх script

Чухал файлуудыг өдөр бүр автоматаар нөөцлөх script. Огноогоор нэрлэгдсэн folder-д хадгалж, хуучин нөөцлөлтүүдийг автоматаар устгана:

bash
#!/bin/bash
set -euo pipefail

# Тохируулга
readonly SOURCE_DIR="${1:-$HOME/Documents}"
readonly BACKUP_ROOT="${2:-$HOME/Backups}"
readonly KEEP_DAYS=30
readonly DATE=$(date +%Y-%m-%d_%H-%M-%S)
readonly BACKUP_DIR="$BACKUP_ROOT/$DATE"

log() {
  echo "[$(date '+%H:%M:%S')] $*"
}

create_backup() {
  log "Нөөцлөлт эхэлж байна: $SOURCE_DIR"

  mkdir -p "$BACKUP_DIR"

  # tar.gz архив үүсгэх
  tar -czf "$BACKUP_DIR/backup.tar.gz" -C "$(dirname "$SOURCE_DIR")" \
    "$(basename "$SOURCE_DIR")" 2>/dev/null

  local size
  size=$(du -sh "$BACKUP_DIR/backup.tar.gz" | cut -f1)
  log "Нөөцлөлт дууслаа. Хэмжээ: $size"
}

cleanup_old_backups() {
  log "Хуучин нөөцлөлт цэвэрлэж байна ($KEEP_DAYS өдрөөс хуучин)..."

  local count=0
  while IFS= read -r -d '' old_dir; do
    rm -rf "$old_dir"
    (( count++ )) || true
  done < <(find "$BACKUP_ROOT" -maxdepth 1 -type d -mtime +"$KEEP_DAYS" -print0)

  if (( count > 0 )); then
    log "$count хуучин нөөцлөлт устгагдлаа"
  else
    log "Устгах хуучин нөөцлөлт байхгүй байна"
  fi
}

show_summary() {
  log "--- Нөөцлөлтийн тоймд ---"
  log "Байршил: $BACKUP_DIR"
  log "Нийт нөөцлөлт:"
  find "$BACKUP_ROOT" -maxdepth 1 -type d | tail -n +2 | wc -l
}

create_backup
cleanup_old_backups
show_summary

Ажиллуулах:

bash
chmod +x backup.sh

# Анхдагч тохируулгаар
./backup.sh

# Тусгай директороор
./backup.sh /home/user/Projects /mnt/external/Backups

Log файл хяналт ба цэвэрлэх

Серверийн log файлууд удалгүй дискийг дүүргэдэг. Энэ script хуучин log-г архивлаж, хэт том файлуудыг таньж мэдэгдэнэ:

bash
#!/bin/bash
set -euo pipefail

readonly LOG_DIR="${1:-/var/log}"
readonly MAX_SIZE_MB=100
readonly ARCHIVE_DAYS=7

log_info() { echo "[МЭДЭЭЛЭЛ] $*"; }
log_warn() { echo "[АНХААРУУЛГА] $*" >&2; }

check_large_logs() {
  log_info "Том log файлуудыг шалгаж байна (>${MAX_SIZE_MB}MB)..."

  local found=0
  while IFS= read -r -d '' file; do
    local size_mb
    size_mb=$(du -m "$file" | cut -f1)
    log_warn "Том файл: $file (${size_mb}MB)"
    (( found++ )) || true
  done < <(find "$LOG_DIR" -name "*.log" -size +"${MAX_SIZE_MB}M" -print0 2>/dev/null)

  if (( found == 0 )); then
    log_info "Том log файл олдсонгүй"
  fi
}

archive_old_logs() {
  log_info "Хуучин log-уудыг архивлаж байна..."

  find "$LOG_DIR" -name "*.log" -mtime +"$ARCHIVE_DAYS" -print0 2>/dev/null \
  | while IFS= read -r -d '' file; do
      gzip -f "$file"
      log_info "Архивлагдлаа: ${file}.gz"
    done
}

show_disk_usage() {
  log_info "Log директорын диск ашиглалт:"
  du -sh "$LOG_DIR" 2>/dev/null || true
}

check_large_logs
archive_old_logs
show_disk_usage

Deployment script

Вэб аппликейшн шинэчлэх автомат script. Git-с хамгийн сүүлийн хувилбарыг татаж, dependency суулгаж, дахин эхлүүлнэ:

bash
#!/bin/bash
set -euo pipefail

readonly APP_DIR="/var/www/myapp"
readonly GIT_BRANCH="${1:-main}"
readonly TIMESTAMP=$(date +%Y%m%d_%H%M%S)
readonly LOG_FILE="/var/log/deploy_$TIMESTAMP.log"

log() {
  local msg="[$(date '+%H:%M:%S')] $*"
  echo "$msg"
  echo "$msg" >> "$LOG_FILE"
}

check_requirements() {
  local tools=("git" "node" "npm")
  for tool in "${tools[@]}"; do
    if ! command -v "$tool" &>/dev/null; then
      log "Алдаа: $tool олдсонгүй" >&2
      exit 1
    fi
  done
  log "Бүх хэрэгсэл бэлэн байна"
}

pull_latest_code() {
  log "Шинэ code татаж байна (branch: $GIT_BRANCH)..."
  cd "$APP_DIR"
  git fetch origin
  git checkout "$GIT_BRANCH"
  git pull origin "$GIT_BRANCH"
  log "Code шинэчлэгдлээ: $(git rev-parse --short HEAD)"
}

install_dependencies() {
  log "Dependencies суулгаж байна..."
  cd "$APP_DIR"
  npm ci --silent
  log "Dependencies суулгагдлаа"
}

restart_service() {
  log "Сервис дахин эхлүүлж байна..."
  if command -v systemctl &>/dev/null; then
    sudo systemctl restart myapp
    log "Сервис дахин эхэллээ"
  else
    log "systemctl олдсонгүй, гараар дахин эхлүүлнэ үү"
  fi
}

check_requirements
pull_latest_code
install_dependencies
restart_service
log "Deployment амжилттай дууслаа! Log: $LOG_FILE"

Системийн хяналтын script

CPU, RAM, disk ашиглалтыг хянаж, хэт ачаалалтай үед email мэдэгдэл илгээдэг script:

bash
#!/bin/bash
set -euo pipefail

readonly CPU_THRESHOLD=80
readonly RAM_THRESHOLD=85
readonly DISK_THRESHOLD=90
readonly NOTIFY_EMAIL="${NOTIFY_EMAIL:-}"

get_cpu_usage() {
  top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'.' -f1
}

get_ram_usage() {
  free | awk '/^Mem:/ {printf "%.0f", $3/$2 * 100}'
}

get_disk_usage() {
  df -h / | awk 'NR==2 {print $5}' | tr -d '%'
}

send_alert() {
  local message="$1"
  echo "[АНХААРУУЛГА] $message"

  if [[ -n "$NOTIFY_EMAIL" ]]; then
    echo "$message" | mail -s "Системийн анхааруулга" "$NOTIFY_EMAIL" 2>/dev/null || true
  fi
}

check_system() {
  local cpu ram disk
  cpu=$(get_cpu_usage)
  ram=$(get_ram_usage)
  disk=$(get_disk_usage)

  echo "=== Системийн байдал $(date) ==="
  printf "CPU:  %3d%%  %s\n" "$cpu"  "$([ "$cpu"  -gt "$CPU_THRESHOLD"  ] && echo '⚠ ӨНДӨР' || echo '✓ Хэвийн')"
  printf "RAM:  %3d%%  %s\n" "$ram"  "$([ "$ram"  -gt "$RAM_THRESHOLD"  ] && echo '⚠ ӨНДӨР' || echo '✓ Хэвийн')"
  printf "Disk: %3d%%  %s\n" "$disk" "$([ "$disk" -gt "$DISK_THRESHOLD" ] && echo '⚠ ӨНДӨР' || echo '✓ Хэвийн')"

  [[ "$cpu"  -gt "$CPU_THRESHOLD"  ]] && send_alert "CPU ачаалал: ${cpu}%"
  [[ "$ram"  -gt "$RAM_THRESHOLD"  ]] && send_alert "RAM ашиглалт: ${ram}%"
  [[ "$disk" -gt "$DISK_THRESHOLD" ]] && send_alert "Disk дүүрлээ: ${disk}%"
}

check_system

Cron-оор 5 минут тутамд ажиллуулах:

bash
crontab -e
# Дараах мөрийг нэм:
# */5 * * * * /home/user/monitor.sh >> /var/log/monitor.log 2>&1

Дараагийн хичээлд:

Эцсийн төслийг гүйцэтгэнэ — энэ курст сурсан бүх зүйлийг нэгтгэсэн бүрэн системийн хэрэгслийн цуглуулга бичнэ.