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-н мэдлэг тэдгээрт маш их тус болно. Амжилт хүсье!