Inhaltsverzeichnis

Übungen Tag 4: SystemD, Dienste und Logging

Diese Übungen vertiefen die Themen von Tag 4 des Linux Expert Workshops.

← Zurück zur Agenda

Übung 4.1: SystemD Service erstellen

Ziel: Eigenen SystemD-Service erstellen und verwalten

Aufgaben:

  1. Erstellen Sie ein einfaches Bash-Skript /usr/local/bin/hello-service.sh:
#!/bin/bash
while true; do
    echo "$(date): Hello from custom service" >> /var/log/hello-service.log
    sleep 60
done
  1. Machen Sie es ausführbar
  2. Erstellen Sie eine Service-Unit /etc/systemd/system/hello.service
  3. Starten Sie den Service
  4. Prüfen Sie den Status
  5. Aktivieren Sie Autostart beim Boot
  6. Stoppen und deaktivieren Sie den Service wieder

Lösung

Lösung

# Skript erstellen
sudo nano /usr/local/bin/hello-service.sh
# Inhalt einfügen
sudo chmod +x /usr/local/bin/hello-service.sh
 
# Service-Unit erstellen
sudo nano /etc/systemd/system/hello.service
[Unit]
Description=Hello Service Demo
After=network.target
 
[Service]
Type=simple
ExecStart=/usr/local/bin/hello-service.sh
Restart=on-failure
RestartSec=10
 
[Install]
WantedBy=multi-user.target
# SystemD neu laden
sudo systemctl daemon-reload
 
# Service starten
sudo systemctl start hello.service
sudo systemctl status hello.service
 
# Autostart aktivieren
sudo systemctl enable hello.service
 
# Logs prüfen
sudo journalctl -u hello.service -f
 
# Aufräumen
sudo systemctl stop hello.service
sudo systemctl disable hello.service


Übung 4.2: SystemD Timer

Ziel: Backup-Automatisierung mit systemd-timer

Aufgaben:

  1. Erstellen Sie ein Backup-Skript /usr/local/bin/backup.sh:
    • Erstellt ein Tar-Archiv von /home
    • Speichert es in /backup mit Zeitstempel
    • Löscht Backups älter als 7 Tage
  2. Erstellen Sie einen Service /etc/systemd/system/backup.service
  3. Erstellen Sie einen Timer /etc/systemd/system/backup.timer (täglich um 02:00 Uhr)
  4. Aktivieren und testen Sie den Timer

Lösung

Lösung

# Backup-Skript
sudo nano /usr/local/bin/backup.sh
#!/bin/bash
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d_%H%M%S)
 
mkdir -p $BACKUP_DIR
tar -czf $BACKUP_DIR/home_backup_$DATE.tar.gz /home 2>/dev/null
 
# Alte Backups löschen
find $BACKUP_DIR -name "home_backup_*.tar.gz" -mtime +7 -delete
 
echo "$(date): Backup completed - $BACKUP_DIR/home_backup_$DATE.tar.gz"
sudo chmod +x /usr/local/bin/backup.sh

backup.service:

[Unit]
Description=Daily Backup Service
Wants=backup.timer
 
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
 
[Install]
WantedBy=multi-user.target

backup.timer:

[Unit]
Description=Daily Backup Timer
Requires=backup.service
 
[Timer]
OnCalendar=daily
OnCalendar=*-*-* 02:00:00
Persistent=true
 
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable backup.timer
sudo systemctl start backup.timer
sudo systemctl list-timers --all
# Test
sudo systemctl start backup.service


Übung 4.3: journalctl Mastery

Ziel: Logs effektiv durchsuchen und analysieren

Aufgaben:

  1. Zeigen Sie Logs der letzten Stunde
  2. Filtern Sie nur Kernel-Meldungen
  3. Zeigen Sie Logs eines bestimmten Services (ssh)
  4. Finden Sie alle ERROR-Meldungen seit gestern
  5. Folgen Sie Logs in Echtzeit
  6. Exportieren Sie Logs als JSON
  7. Zeigen Sie Boot-Logs

Lösung

Lösung

# Letzte Stunde
sudo journalctl --since "1 hour ago"
 
# Kernel-Meldungen
sudo journalctl -k
 
# Bestimmter Service
sudo journalctl -u ssh.service
 
# Errors seit gestern
sudo journalctl --since yesterday -p err
 
# Echtzeit folgen
sudo journalctl -f
 
# Als JSON
sudo journalctl -o json-pretty -n 10
 
# Boot-Logs
sudo journalctl --list-boots
sudo journalctl -b 0  # Aktueller Boot
sudo journalctl -b -1 # Vorheriger Boot
 
# Kombiniert: SSH-Fehler heute
sudo journalctl -u ssh.service --since today -p err
 
# Speicher-Statistik
sudo journalctl --disk-usage


Übung 4.4: Log-Rotation konfigurieren

Ziel: Eigene Log-Rotation für Custom-Service

Aufgaben:

  1. Erstellen Sie /etc/logrotate.d/hello-service
  2. Konfigurieren Sie:
    • Tägliche Rotation
    • 7 Archive behalten
    • Kompression
    • Service nach Rotation neu laden
  3. Testen Sie die Konfiguration

Lösung

Lösung

sudo nano /etc/logrotate.d/hello-service
/var/log/hello-service.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root adm
    sharedscripts
    postrotate
        systemctl reload hello.service > /dev/null 2>&1 || true
    endscript
}
# Syntax testen
sudo logrotate -d /etc/logrotate.d/hello-service
 
# Manuell ausführen (Test)
sudo logrotate -f /etc/logrotate.d/hello-service


Übung 4.5: Automatisierung mit cron

Ziel: Wartungs-Tasks mit cron automatisieren

Aufgaben:

  1. Erstellen Sie ein Cleanup-Skript /usr/local/bin/cleanup.sh:
    • Löscht /tmp-Dateien älter als 7 Tage
    • Leert den Package-Cache
    • Erstellt einen Report in /var/log/cleanup.log
  2. Richten Sie Cron-Jobs ein:
    • Täglich um 03:00 Uhr
    • Wöchentlich Sonntags um 04:00 Uhr (vollständiger Cleanup)
  3. Testen Sie das Skript

Lösung

Lösung

# Cleanup-Skript
sudo nano /usr/local/bin/cleanup.sh
#!/bin/bash
LOG="/var/log/cleanup.log"
 
echo "=== Cleanup started: $(date) ===" >> $LOG
 
# /tmp aufräumen
DELETED=$(find /tmp -type f -mtime +7 -delete -print | wc -l)
echo "Deleted $DELETED old files from /tmp" >> $LOG
 
# Package Cache
if [ "$1" == "full" ]; then
    apt-get clean >> $LOG 2>&1
    echo "Package cache cleaned" >> $LOG
fi
 
# Disk Usage
df -h / >> $LOG
 
echo "=== Cleanup finished: $(date) ===" >> $LOG
echo "" >> $LOG
sudo chmod +x /usr/local/bin/cleanup.sh
 
# Crontab bearbeiten
sudo crontab -e
# Täglicher Cleanup um 03:00 Uhr
0 3 * * * /usr/local/bin/cleanup.sh

# Wöchentlicher vollständiger Cleanup (Sonntag 04:00 Uhr)
0 4 * * 0 /usr/local/bin/cleanup.sh full

# Log-Rotation täglich um 05:00 Uhr
0 5 * * * /usr/sbin/logrotate /etc/logrotate.conf
# Cron-Jobs auflisten
sudo crontab -l
 
# Manuell testen
sudo /usr/local/bin/cleanup.sh
cat /var/log/cleanup.log


Zusatz-Challenge: Monitoring-System

Erstellen Sie ein komplettes Monitoring-System:

  1. Service der CPU, RAM, Disk überwacht
  2. Logs bei > 80% Auslastung
  3. Timer der stündlich prüft
  4. Alert-Skript bei kritischen Werten
  5. Dashboard-Report in /var/www/html/status.html

Lösung

Lösung

#!/bin/bash
# /usr/local/bin/monitor.sh
THRESHOLD=80
ALERT_LOG="/var/log/monitor-alerts.log"
 
CPU=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
MEM=$(free | grep Mem | awk '{print ($3/$2) * 100.0}' | cut -d'.' -f1)
DISK=$(df / | tail -1 | awk '{print $5}' | cut -d'%' -f1)
 
if [ $CPU -gt $THRESHOLD ] || [ $MEM -gt $THRESHOLD ] || [ $DISK -gt $THRESHOLD ]; then
    echo "$(date): ALERT - CPU:${CPU}% MEM:${MEM}% DISK:${DISK}%" >> $ALERT_LOG
fi
 
# HTML-Report
cat > /var/www/html/status.html << EOF
<!DOCTYPE html>
<html>
<head><title>System Status</title></head>
<body>
<h1>System Status - $(date)</h1>
<ul>
<li>CPU: ${CPU}%</li>
<li>Memory: ${MEM}%</li>
<li>Disk: ${DISK}%</li>
</ul>
</body>
</html>
EOF


Siehe auch