Автоматжуулалтын жишээ
Bash сурсан бүх зүйлийг одоо бодит ажилд хэрэглэх цаг боллоо. Энэ хичээлд хөгжүүлэгчид өдөр бүр тулгардаг асуудлуудыг шийдэх дөрвөн бүтэн script бичнэ. Эдгээр жишээнүүдийг шууд ажлаа дээр хэрэглэж болно.
Файл нөөцлөх script
Чухал файлуудыг өдөр бүр автоматаар нөөцлөх script. Огноогоор нэрлэгдсэн folder-д хадгалж, хуучин нөөцлөлтүүдийг автоматаар устгана:
#!/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
Ажиллуулах:
chmod +x backup.sh
# Анхдагч тохируулгаар
./backup.sh
# Тусгай директороор
./backup.sh /home/user/Projects /mnt/external/Backups
Log файл хяналт ба цэвэрлэх
Серверийн log файлууд удалгүй дискийг дүүргэдэг. Энэ script хуучин log-г архивлаж, хэт том файлуудыг таньж мэдэгдэнэ:
#!/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 суулгаж, дахин эхлүүлнэ:
#!/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:
#!/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 минут тутамд ажиллуулах:
crontab -e
# Дараах мөрийг нэм:
# */5 * * * * /home/user/monitor.sh >> /var/log/monitor.log 2>&1
Дараагийн хичээлд:
Эцсийн төслийг гүйцэтгэнэ — энэ курст сурсан бүх зүйлийг нэгтгэсэн бүрэн системийн хэрэгслийн цуглуулга бичнэ.