اتوماسیون سازمانی، مانیتورینگ منابع، سرویسهای 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
شما این مسیر یادگیری ۵ مرحلهای را با موفقیت طی کردید:
قسمت اول: مبانی لینوکس، درخت دایرکتوریها (FHS) و دستورات اصلی.
قسمت دوم: قدرت Pipeها، ورودی/خروجی استاندارد و فیلترهای
grep،sedوawk.قسمت سوم: شروع اسکریپتنویسی Bash، متغیرها، شرطها و حلقهها.
قسمت چهارم: الگوهای پیشرفته، توابع ماژولار،
set -euo pipefailو مدیریت خطایtrap.قسمت پنجم: اتوماسیون، سرویسهای Systemd، زمانبندی دقیق و مانیتورینگ بلادرنگ سرور.
با به کار بستن این آموختهها، اکنون قادرید زیرساختهای شخصی یا سازمانی خود را با اسکریپتهایی استاندارد، ایمن و خودکار مدیریت کنید.
