Einen systemd-Backup-Timer & -Dienst in 10 Sekunden erstellen

English Deutsch

In unserem vorherigen Beitrag Einen systemd-Dienst für Ihr docker-compose-Projekt in 10 Sekunden erstellen haben wir ein Skript vorgestellt, das automatisch einen systemd-Dienst erstellt, um ein docker-compose-basiertes Projekt zu starten. In diesem Beitrag zeigen wir

Zuerst müssen Sie eine Datei namens backup.sh in dem Verzeichnis erstellen, in dem sich docker-compose.yml befindet. Diese Datei wird vom systemd-Dienst jeden Tag ausgeführt. Was diese Datei enthält, ist ganz Ihnen überlassen, und wir werden in zukünftigen Blogposts Beispiele geben.

Zweitens, führen Sie aus

create-backup-service.sh
wget -qO- https://techoverflow.net/scripts/create-backup-service.sh | sudo bash /dev/stdin

aus dem Verzeichnis, in dem sich docker-compose.yml befindet. Beachten Sie, dass das Skript den Verzeichnisnamen als Namen für den erstellten Dienst und Timer verwendet. Wenn Sie das Skript beispielsweise in /var/lib/redmine-mydomain ausführen, wird redmine-mydomain-backup als Dienstname verwendet.

Beispielausgabe des Skripts:

output.txt
Creating systemd service... /etc/systemd/system/redmine-mydomain-backup.service
Creating systemd timer... /etc/systemd/system/redmine-mydomain-backup.timer
Enabling & starting redmine-mydomain-backup.timer
Created symlink /etc/systemd/system/timers.target.wants/redmine-mydomain-backup.timer → /etc/systemd/system/redmine-mydomain-backup.timer.

Das Skript erstellt /etc/systemd/systemd/redmine-mydomain-backup.service mit der Spezifikation, was genau ausgeführt werden soll:

redmine-mydomain-backup.service
[Unit]
Description=redmine-mydomain-backup

[Service]
Type=oneshot
ExecStart=/bin/bash backup.sh
WorkingDirectory=/var/lib/redmine-mydomain

und /etc/systemd/systemd/redmine-mydomain-backup.timer mit der Logik, wann der .service gestartet wird:

redmine-mydomain-backup.timer
[Unit]
Description=redmine-mydomain-backup

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

und wird den Timer automatisch starten und aktivieren. Das bedeutet: keine weiteren Schritte sind nach dem Ausführen dieses Skripts nötig!

Um den aktuellen Status des Dienstes anzuzeigen, verwenden Sie z.B.

status.sh
sudo systemctl status redmine-mydomain-backup.timer

Beispielausgabe:

output.txt
● redmine-mydomain-backup.timer - redmine-mydomain-backup
      Loaded: loaded (/etc/systemd/system/redmine-mydomain-backup.timer; enabled; vendor preset: enabled)
      Active: active (waiting) since Thu 2020-12-10 02:50:31 CET; 19min ago
     Trigger: Fri 2020-12-11 00:00:00 CET; 20h left
    Triggers: ● redmine-mydomain-backup.service

Dec 10 02:50:31 myserverhostname systemd[1]: Started redmine-mydomain-backup.

In der Zeile

output.txt
Trigger: Fri 2020-12-11 00:00:00 CET; 20h left

können Sie sehen, wann der Dienst als nächstes ausgeführt wird. Standardmäßig generiert das Skript Aufgaben, die OnCalendar=daily ausführen, was bedeutet, dass der Dienst jeden Tag um 00:00:00 ausgeführt wird. Lesen Sie die systemd.time-Manpage für weitere Informationen zur Syntax, die Sie verwenden können, um andere Zeitrahmen anzugeben.

Um das Backup sofort auszuführen (es wird danach immer noch täglich ausgeführt), führen Sie aus

start_backup.sh
sudo systemctl start redmine-mydomain-backup.service

(beachten Sie, dass Sie systemctl start auf dem .service ausführen müssen! systemctl start auf dem .timer aktiviert nur den Timer und führt den Dienst nicht sofort aus).

Um die Logs anzuzeigen, verwenden Sie

journal.sh
sudo journalctl -xfu redmine-mydomain-backup.service

(genau wie oben müssen Sie journalctl -xfu auf dem .service ausführen, nicht auf dem .timer).

Um automatische Backups zu deaktivieren, verwenden Sie z.B.

disable_timer.sh
sudo systemctl disable redmine-mydomain-backup.timer

Quellcode:

create-backup-service.sh
#!/bin/bash
# Einen systemd-Dienst & Timer erstellen, der das gegebene Backup täglich ausführt
# by Uli Köhler - https://techoverflow.net
# Licensed as CC0 1.0 Universal
export SERVICENAME=$(basename $(pwd))-backup

export SERVICEFILE=/etc/systemd/system/${SERVICENAME}.service
export TIMERFILE=/etc/systemd/system/${SERVICENAME}.timer

echo "Creating systemd service... $SERVICEFILE"
sudo cat >$SERVICEFILE <<EOF
[Unit]
Description=$SERVICENAME

[Service]
Type=oneshot
ExecStart=/bin/bash backup.sh
WorkingDirectory=$(pwd)
EOF

echo "Creating systemd timer... $TIMERFILE"
sudo cat >$TIMERFILE <<EOF
[Unit]
Description=$SERVICENAME

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
EOF

echo "Enabling & starting $SERVICENAME.timer"
sudo systemctl enable $SERVICENAME.timer
sudo systemctl start $SERVICENAME.timer

Check out similar posts by category: Docker, Linux