Automonitoring serwera Linux - prosty projekt bash

📋 Opis projektu

Ten projekt zawiera skrypt bash do monitorowania podstawowych zasobów serwera Linux (CPU, pamięć RAM, przestrzeń dyskowa) oraz wysyłania powiadomień e-mail w przypadku przekroczenia zdefiniowanych progów. To świetne narzędzie dla administratorów serwerów oraz entuzjastów Linuksa, którzy chcą mieć pod kontrolą wydajność swoich systemów.

🎯 Cele projektu

  • Monitoring podstawowych zasobów: Śledzenie wykorzystania CPU, pamięci RAM i przestrzeni dyskowej
  • Automatyczne powiadomienia: Wysyłanie alertów e-mail w przypadku przekroczenia progów
  • Prostota wdrożenia: Łatwy w implementacji skrypt bash bez dodatkowych zależności
  • Możliwość rozbudowy: Modułowa struktura umożliwiająca łatwe rozszerzanie funkcjonalności

💻 Wymagania

  • Serwer Linux (testowano na Ubuntu, Debian, CentOS)
  • Bash (dostępny domyślnie w większości dystrybucji Linux)
  • Dostęp do polecenia mail (lub podobnego) do wysyłania e-maili
  • Podstawowa znajomość edytorów tekstu (nano, vim, itp.)
  • Uprawnienia do ustawiania zadań cron

📝 Implementacja

Krok 1: Tworzenie skryptu monitorującego

Utwórz plik system_monitor.sh i otwórz go w edytorze:

#!/bin/bash

# Konfiguracja
EMAIL="twoj-email@domena.pl"
SUBJECT="Alert: Problem na serwerze $(hostname)"
LOG_FILE="/var/log/system_monitor.log"

# Progi alertów (w procentach)
CPU_THRESHOLD=80
MEMORY_THRESHOLD=80
DISK_THRESHOLD=80

# Funkcja do wysyłania powiadomień
send_alert() {
    local resource=$1
    local usage=$2
    local threshold=$3
    local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
    
    echo "$timestamp - ALERT: $resource użycie przekroczyło próg! Obecne użycie: $usage%, Próg: $threshold%" >> "$LOG_FILE"
    
    # Przygotowanie wiadomości e-mail
    local email_body="
    Wykryto przekroczenie progu wykorzystania zasobów na serwerze $(hostname)
    
    Zasób: $resource
    Obecne użycie: $usage%
    Próg: $threshold%
    Czas: $timestamp
    
    Prosimy o sprawdzenie serwera.
    "
    
    # Wysłanie e-maila
    echo "$email_body" | mail -s "$SUBJECT" "$EMAIL"
}

# Funkcja do sprawdzania CPU
check_cpu() {
    # Pobieranie aktualnego użycia CPU
    local cpu_idle=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/")
    local cpu_usage=$(echo "100 - $cpu_idle" | bc)
    cpu_usage=${cpu_usage%.*} # Usunięcie części dziesiętnej
    
    echo "Aktualne użycie CPU: $cpu_usage%"
    
    # Sprawdzenie progu
    if [ "$cpu_usage" -ge "$CPU_THRESHOLD" ]; then
        send_alert "CPU" "$cpu_usage" "$CPU_THRESHOLD"
    fi
}

# Funkcja do sprawdzania pamięci RAM
check_memory() {
    # Pobieranie aktualnego użycia pamięci
    local memory_usage=$(free | awk '/Mem/ {printf("%.1f", $3/$2 * 100)}')
    memory_usage=${memory_usage%.*} # Usunięcie części dziesiętnej
    
    echo "Aktualne użycie pamięci: $memory_usage%"
    
    # Sprawdzenie progu
    if [ "$memory_usage" -ge "$MEMORY_THRESHOLD" ]; then
        send_alert "Pamięć" "$memory_usage" "$MEMORY_THRESHOLD"
    fi
}

# Funkcja do sprawdzania miejsca na dysku
check_disk() {
    # Pobieranie aktualnego użycia dysku dla głównej partycji
    local disk_usage=$(df -h / | awk '/\// {print $(NF-1)}')
    disk_usage=${disk_usage%\%} # Usunięcie znaku procentu
    
    echo "Aktualne użycie dysku: $disk_usage%"
    
    # Sprawdzenie progu
    if [ "$disk_usage" -ge "$DISK_THRESHOLD" ]; then
        send_alert "Dysk" "$disk_usage" "$DISK_THRESHOLD"
    fi
}

# Główna funkcja
main() {
    local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
    echo "-----------------------------------" >> "$LOG_FILE"
    echo "$timestamp - Uruchomienie monitoringu systemu" >> "$LOG_FILE"
    
    # Sprawdzenie zasobów
    check_cpu
    check_memory
    check_disk
    
    echo "$timestamp - Zakończenie monitoringu systemu" >> "$LOG_FILE"
    echo "-----------------------------------" >> "$LOG_FILE"
}

# Uruchomienie głównej funkcji
main

Krok 2: Nadanie uprawnień wykonywania

chmod +x system_monitor.sh

Krok 3: Konfiguracja automatycznego uruchamiania (cron)

Otwórz edytor crontab:

crontab -e

Dodaj linię, aby uruchamiać skrypt co 15 minut:

*/15 * * * * /ścieżka/do/system_monitor.sh

🚀 Rozbudowa projektu

Skrypt można z łatwością rozbudować o dodatkowe funkcjonalności:

Monitorowanie usług

Dodaj do skryptu funkcję sprawdzającą, czy kluczowe usługi są uruchomione:

check_service() {
    local service_name=$1
    systemctl is-active --quiet "$service_name"
    if [ $? -ne 0 ]; then
        send_alert "Usługa" "$service_name nie działa" "Aktywna"
        # Opcjonalnie - automatyczny restart usługi
        systemctl restart "$service_name"
    fi
}

# Przykład użycia w funkcji main
check_service "nginx"
check_service "mysql"

Monitoring ataku brute force

Dodaj sprawdzanie prób logowania:

check_brute_force() {
    local attempts=$(grep "Failed password" /var/log/auth.log | wc -l)
    if [ "$attempts" -gt 10 ]; then
        send_alert "Bezpieczeństwo" "$attempts nieudanych prób logowania" "10"
    fi
}

Dashboard w HTML

Możesz również rozszerzyć skrypt, aby generował prosty raport HTML:

generate_html_report() {
    local report_file="/var/www/html/status.html"
    local timestamp=$(date "+%Y-%m-%d %H:%M:%S")
    
    cat > "$report_file" << EOF
<!DOCTYPE html>
<html>
<head>
    <title>Status serwera $(hostname)</title>
    <meta charset="UTF-8">
    <meta http-equiv="refresh" content="300">
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; }
        .status { padding: 10px; margin: 10px 0; border-radius: 5px; }
        .ok { background-color: #d4edda; }
        .warning { background-color: #fff3cd; }
        .critical { background-color: #f8d7da; }
    </style>
</head>
<body>
    <h1>Status serwera $(hostname)</h1>
    <p>Ostatnia aktualizacja: $timestamp</p>
    
    <div class="status $([ "$cpu_usage" -ge "$CPU_THRESHOLD" ] && echo "critical" || echo "ok")">
        <h2>CPU</h2>
        <p>Użycie: $cpu_usage%</p>
    </div>
    
    <div class="status $([ "$memory_usage" -ge "$MEMORY_THRESHOLD" ] && echo "critical" || echo "ok")">
        <h2>Pamięć RAM</h2>
        <p>Użycie: $memory_usage%</p>
    </div>
    
    <div class="status $([ "$disk_usage" -ge "$DISK_THRESHOLD" ] && echo "critical" || echo "ok")">
        <h2>Dysk</h2>
        <p>Użycie: $disk_usage%</p>
    </div>
</body>
</html>
EOF
}

📊 Wnioski

Ten prosty skrypt monitorujący może okazać się nieoceniony dla każdego administratora systemu Linux. Dzięki niemu będziesz otrzymywać natychmiastowe powiadomienia o potencjalnych problemach, zanim staną się one krytyczne.

Skrypt jest również dobrym punktem wyjścia do nauki i rozwijania umiejętności w zakresie programowania w bashu oraz administracji systemami Linux.

📝 Zastrzeżenia

Ten skrypt jest przeznaczony głównie do celów edukacyjnych i podstawowego monitoringu. W środowiskach produkcyjnych warto rozważyć bardziej zaawansowane rozwiązania monitorujące, takie jak Nagios, Zabbix czy Prometheus.