بازگشت به لیست مقالات

آموزش جامع لینوکس و Bash؛ قسمت پنجم (پایانی) اتوماسیون سازمانی، مانیتورینگ منابع، سرویس‌های Systemd و ارسال هشدارهای آنی

#اتوماسیون لینوکس#Systemd#مانیتورینگ لینوکس
آموزش جامع لینوکس و Bash؛ قسمت پنجم (پایانی)  اتوماسیون سازمانی، مانیتورینگ منابع، سرویس‌های Systemd و ارسال هشدارهای آنی

اتوماسیون سازمانی، مانیتورینگ منابع، سرویس‌های Systemd و ارسال هشدارهای آنی

به آخرین قسمت از مجموعه آموزش جامع لینوکس و اسکریپت‌نویسی Bash در تیوا کد (TivaCode) خوش آمدید. تا این نقطه، از مفاهیم پایه خط فرمان و ابزارهای پردازش متن عبور کردیم و اسکریپت‌هایی مقاوم و ماژولار ساختیم. اکنون زمان آن رسیده که قطعات این پازل را در کنار هم قرار دهیم و اسکریپت‌هایمان را به سیستم‌های خودکار، مستقل، مقیاس‌پذیر و مانیتورینگ بلادرنگ در محیط‌های سازمانی و کلود تبدیل کنیم.

در این مقاله، مدیریت سرویس‌ها با Systemd، زمان‌بندی دقیق وظایف، اجرای ریموت از طریق SSH و سیستم اعلان هشدار (Alerting) به تلگرام، دیسکورد و وبهوک‌ها را بررسی خواهیم کرد.


۱. زمان‌بندی وظایف: مقایسه Cron Jobs و Systemd Timers

برای اجرای خودکار اسکریپت‌ها در فواصل مشخص، دو راهکار اصلی در لینوکس وجود دارد:

۱. ابزار سنتی: Cron Jobs

محتوای ویژه

کرون جاب‌ها ساده‌ترین ابزار زمان‌بندی هستند. با دستور crontab -e فایل زمان‌بندی کاربر را باز کنید:

# ┌───────────── دقیقه (0 - 59)
# │ ┌───────────── ساعت (0 - 23)
# │ │ ┌───────────── روز از ماه (1 - 31)
# │ │ │ ┌───────────── ماه (1 - 12)
# │ │ │ │ ┌───────────── روز از هفته (0 - 6) (یکشنبه = 0)
# │ │ │ │ │
# * * * * * <دستور برای اجرا>

مثال‌های کاربردی:

# اجرای اسکریپت بک‌آپ هر روز راس ساعت ۰۲:۳۰ بامداد
30 2 * * * /usr/local/bin/backup_manager.sh >> /var/log/backup.log 2>&1

# اجرای بررسی سلامت سرور هر ۱۵ دقیقه
*/15 * * * * /opt/scripts/health_check.sh

۲. راهکار استاندارد و مدرن: Systemd Timers

در سازمان‌های مدرن، Systemd Timers به دلیل لاگ‌گیری یکپارچه در journalctl، وابستگی دقیق سرویس‌ها و پایداری بالاتر، جایگزین مطمئن‌تری برای Cron محسوب می‌شوند.

برای راه‌اندازی یک Timer به دو فایل در مسیر /etc/systemd/system/ نیاز داریم:

الف) فایل سرویس: /etc/systemd/system/tivacode-backup.service

[Unit]
Description=TivaCode Automated Backup Service
After=network.target

[Service]
Type=oneshot
User=root
ExecStart=/usr/local/bin/backup_manager.sh

ب) فایل تایمر: /etc/systemd/system/tivacode-backup.timer

[Unit]
Description=Run TivaCode Backup Daily at 03:00 AM

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target

فعال‌سازی تایمر:

sudo systemctl daemon-reload
sudo systemctl enable --now tivacode-backup.timer
# بررسی وضعیت تایمرها
systemctl list-timers --all

۲. تبدیل اسکریپت Bash به یک Daemon همیشه‌روشن در Systemd

اگر اسکریپتی دارید که باید همواره در پس‌زمینه در حال اجرا باشد (مانند ورکرها، بات‌ها یا مانیتورهای مستمر) و در صورت Crash کردن به طور خودکار ری‌استارت شود:

فایل /etc/systemd/system/tivacode-monitor.service:

[Unit]
Description=TivaCode Live Resource Watcher
After=network.target

[Service]
Type=simple
User=tivacode
WorkingDirectory=/opt/tivacode-monitor
ExecStart=/bin/bash /opt/tivacode-monitor/watcher.sh
Restart=always
RestartSec=5s
Environment=ENVIRONMENT=production

# لاگ‌گیری در ژورنال لینوکس
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

مدیریت سرویس:

sudo systemctl daemon-reload
sudo systemctl enable --now tivacode-monitor
sudo systemctl status tivacode-monitor
# مشاهده لاگ‌های زنده سرویس
journalctl -u tivacode-monitor -f

۳. خودکارسازی عملیات از راه دور (Remote Automation) با SSH

در محیط‌های چند سروره (Multi-Node Cluster)، اسکریپت‌ها باید دستورات را روی سرورهای دوردست بدون نیاز به پسورد و از طریق SSH Key اجرا کنند.

تولید کلید و انتقال امن:

# ساخت جفت کلید ED25519 امن
ssh-keygen -t ed25519 -C "deploy@tivacode"

# کپی کلید عمومی روی سرور هدف
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote-node-01

اجرای دستورات و اسکریپت‌ها روی کلاستر:

#!/usr/bin/env bash
set -euo pipefail

NODES=("192.168.1.50" "192.168.1.51" "192.168.1.52")

for node in "${NODES[@]}"; do
    echo "=== Updating node: $node ==="
    # اجرای دستور بدون ورود تعاملی
    ssh -o BatchMode=yes -o ConnectTimeout=5 "admin@$node" '
        sudo apt-get update -y && sudo apt-get --only-upgrade install nginx -y
    '
done

۴. ساخت سیستم اعلان هشدار (Telegram / Discord / Webhook)

اسکریپت مانیتورینگ بدون سیستم اعلان، کارایی کاملی در پروداکشن ندارد. با استفاده از curl می‌توان مستقیماً هشدارهای حیاتی را به کانال‌های ارتباطی ارسال کرد.

#!/usr/bin/env bash

# پیکربندی بات تلگرام
readonly TG_BOT_TOKEN="YOUR_BOT_TOKEN"
readonly TG_CHAT_ID="YOUR_CHAT_ID"

send_telegram_alert() {
    local message="$1"
    local url="https://api.telegram.org/bot${TG_BOT_TOKEN}/sendMessage"
    
    curl -s -X POST "$url" \
        -d chat_id="$TG_CHAT_ID" \
        -d text="$message" \
        -d parse_mode="HTML" > /dev/null || echo "[ERROR] Failed to send Telegram alert" >&2
}

# پیکربندی وب‌هوک دیسکورد
readonly DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/..."

send_discord_alert() {
    local message="$1"
    
    # ساخت Payload جی‌سان ایمن با jq
    local payload
    payload=$(jq -n --arg content "$message" '{"content": $content}')

    curl -s -H "Content-Type: application/json" \
        -X POST \
        -d "$payload" \
        "$DISCORD_WEBHOOK_URL" > /dev/null || echo "[ERROR] Failed to send Discord alert" >&2
}

۵. پروژه عملی نهایی: مانیتورینگ سلامت سرور و زیرساخت (TivaWatch)

اکنون تمام دانش این دوره ۵ قسمتی را در قالب یک ابزار نظارتی جامع پیاده‌سازی می‌کنیم. این اسکریپت مصرف دیسک، حافظه RAM، لود پردازنده (CPU Load) و وضعیت سرویس‌های حساس (مانند Nginx یا PostgreSQL) را چک کرده و در صورت بروز اختلال، اعلان اضطراری می‌فرستد.

فایل: /usr/local/bin/tivawatch.sh

#!/usr/bin/env bash
# ==============================================================================
# Script Name: tivawatch.sh
# Purpose: Enterprise System Health Monitoring & Instant Alerting System
# Author: TivaCode Engineering Team
# ==============================================================================

set -euo pipefail

# ----------------- آستانه‌های هشدار (Thresholds) -----------------
readonly DISK_THRESHOLD=85       # درصد
readonly MEMORY_THRESHOLD=90     # درصد
readonly CPU_LOAD_THRESHOLD=4.0   # میانگین لود ۵ دقیقه‌ای
readonly CRITICAL_SERVICES=("nginx" "docker" "postgresql")

# ----------------- پیکربندی بات تلگرام -----------------
readonly TG_BOT_TOKEN="${TELEGRAM_BOT_TOKEN:-}"
readonly TG_CHAT_ID="${TELEGRAM_CHAT_ID:-}"
readonly HOSTNAME="$(hostname)"

# ----------------- ماژول ارسال پیام -----------------
send_alert() {
    local subject="$1"
    local details="$2"
    local timestamp
    timestamp="$(date '+%Y-%m-%d %H:%M:%S')"

    local alert_msg="🚨 <b>TivaWatch Alert: ${HOSTNAME}</b>
<b>Subject:</b> ${subject}
<b>Time:</b> ${timestamp}
<b>Details:</b>
<code>${details}</code>"

    if [[ -n "$TG_BOT_TOKEN" && -n "$TG_CHAT_ID" ]]; then
        curl -s -X POST "https://api.telegram.org/bot${TG_BOT_TOKEN}/sendMessage" \
            -d chat_id="${TG_CHAT_ID}" \
            -d text="${alert_msg}" \
            -d parse_mode="HTML" > /dev/null 2>&1 || true
    fi

    # چاپ در ژورنال سیستمی
    printf "[CRITICAL] [%s] %s: %s\n" "$timestamp" "$subject" "$details" >&2
}

# ----------------- بررسی دیسک -----------------
check_disk() {
    local disk_usage
    disk_usage=$(df -h / | awk 'NR==2 {print $5}' | tr -dc '0-9')

    if (( disk_usage >= DISK_THRESHOLD )); then
        send_alert "High Disk Usage" "Root partition usage is at ${disk_usage}% (Threshold: ${DISK_THRESHOLD}%)"
    fi
}

# ----------------- بررسی حافظه RAM -----------------
check_memory() {
    local mem_usage
    mem_usage=$(free | awk '/Mem:/ {printf "%.0f", ($3/$2) * 100}')

    if (( mem_usage >= MEMORY_THRESHOLD )); then
        send_alert "High Memory Usage" "RAM usage is at ${mem_usage}% (Threshold: ${MEMORY_THRESHOLD}%)"
    fi
}

# ----------------- بررسی لود CPU -----------------
check_cpu_load() {
    local cpu_load_5min
    cpu_load_5min=$(uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $2}' | tr -d ' ')
    
    # مقایسه اعشاری با bc
    if (( $(echo "$cpu_load_5min > $CPU_LOAD_THRESHOLD" | bc -l) )); then
        send_alert "High CPU Load" "5-minute load average is ${cpu_load_5min} (Threshold: ${CPU_LOAD_THRESHOLD})"
    fi
}

# ----------------- بررسی سلامت سرویس‌ها -----------------
check_services() {
    for service in "${CRITICAL_SERVICES[@]}"; do
        if systemctl is-active --quiet "$service"; then
            continue
        else
            send_alert "Service Down" "Critical service '${service}' is inactive or failing!"
        fi
    done
}

# ----------------- تابع اصلی -----------------
main() {
    check_disk
    check_memory
    check_cpu_load
    check_services
}

main "$@"

مجوز اجرا:

chmod +x /usr/local/bin/tivawatch.sh

جمع‌بندی نهایی دوره ۵ قسمتی لینوکس و Bash

شما این مسیر یادگیری ۵ مرحله‌ای را با موفقیت طی کردید:

  1. قسمت اول: مبانی لینوکس، درخت دایرکتوری‌ها (FHS) و دستورات اصلی.

  2. قسمت دوم: قدرت Pipeها، ورودی/خروجی استاندارد و فیلترهای grep، sed و awk.

  3. قسمت سوم: شروع اسکریپت‌نویسی Bash، متغیرها، شرط‌ها و حلقه‌ها.

  4. قسمت چهارم: الگوهای پیشرفته، توابع ماژولار، set -euo pipefail و مدیریت خطای trap.

  5. قسمت پنجم: اتوماسیون، سرویس‌های Systemd، زمان‌بندی دقیق و مانیتورینگ بلادرنگ سرور.

با به کار بستن این آموخته‌ها، اکنون قادرید زیرساخت‌های شخصی یا سازمانی خود را با اسکریپت‌هایی استاندارد، ایمن و خودکار مدیریت کنید.

محتوای ویژه
💬

نظرات کاربران

نظرات کاربران

برای ثبت نظر، لطفاً ابتدا وارد حساب کاربری خود شوید.

ورود / ثبت نام

در حال بارگذاری نظرات...

محتوای ویژه

محتوای ویژه