====== Übungen Tag 4: SystemD, Dienste und Logging ======
Diese Übungen vertiefen die Themen von Tag 4 des Linux Expert Workshops.
[[agenda:agenda-expert_2|← Zurück zur Agenda]]
===== Übung 4.1: SystemD Service erstellen =====
**Ziel:** Eigenen SystemD-Service erstellen und verwalten
**Aufgaben:**
- 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
- Machen Sie es ausführbar
- Erstellen Sie eine Service-Unit /etc/systemd/system/hello.service
- Starten Sie den Service
- Prüfen Sie den Status
- Aktivieren Sie Autostart beim Boot
- Stoppen und deaktivieren Sie den Service wieder
# 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:**
- 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
- Erstellen Sie einen Service /etc/systemd/system/backup.service
- Erstellen Sie einen Timer /etc/systemd/system/backup.timer (täglich um 02:00 Uhr)
- Aktivieren und testen Sie den Timer
# 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:**
- Zeigen Sie Logs der letzten Stunde
- Filtern Sie nur Kernel-Meldungen
- Zeigen Sie Logs eines bestimmten Services (ssh)
- Finden Sie alle ERROR-Meldungen seit gestern
- Folgen Sie Logs in Echtzeit
- Exportieren Sie Logs als JSON
- Zeigen Sie Boot-Logs
# 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:**
- Erstellen Sie /etc/logrotate.d/hello-service
- Konfigurieren Sie:
* Tägliche Rotation
* 7 Archive behalten
* Kompression
* Service nach Rotation neu laden
- Testen Sie die Konfiguration
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:**
- 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
- Richten Sie Cron-Jobs ein:
* Täglich um 03:00 Uhr
* Wöchentlich Sonntags um 04:00 Uhr (vollständiger Cleanup)
- Testen Sie das Skript
# 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:**
- Service der CPU, RAM, Disk überwacht
- Logs bei > 80% Auslastung
- Timer der stündlich prüft
- Alert-Skript bei kritischen Werten
- Dashboard-Report in /var/www/html/status.html
#!/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
System Status
System Status - $(date)
- CPU: ${CPU}%
- Memory: ${MEM}%
- Disk: ${DISK}%
EOF
\\
===== Siehe auch =====
* [[sammlung:systemd|SystemD]]
* [[sammlung:journalctl|journalctl]]
* [[sammlung:crontab|cron]]
* [[sammlung:systemd_timer|systemd-timer]]
{{tag>übung workshop systemd logging automatisierung}}