systemd: Service-Timer erstellen, der Nextcloud cron.php in 10 Sekunden ausführt

English Deutsch

Dieser Beitrag zeigt eine wirklich schnelle Methode, um einen systemd-Timer zu erstellen, der cron.php auf dockerized Nextcloud (mit docker-compose) ausführt. Wir haben ein Skript erstellt, das automatisch einen systemd-Timer und den zugehörigen Service erstellt, um cron.php stündlich mit dem Befehl aus unserem vorherigen Beitrag How to run Nextcloud cron in a docker-compose based setup auszuführen:

Um unser Autoinstall-Skript auszuführen, führe Folgendes aus:

install_nextcloud_cron.sh
wget -qO- https://techoverflow.net/scripts/install-nextcloud-cron.sh | sudo bash /dev/stdin

im Verzeichnis aus, in dem sich docker-compose.yml befindet. Beachte, dass das Skript den Verzeichnisnamen als Namen für den erstellten Service und Timer verwendet. Wenn du das Skript beispielsweise in /var/lib/nextcloud-mydomain ausführst, wird nextcloud-mydomain-cron als Service-Name verwendet.

Beispielausgabe des Skripts:

nextcloud_cron_install_output.txt
Creating systemd service... /etc/systemd/system/nextcloud-mydomain-cron.service
Creating systemd timer... /etc/systemd/system/nextcloud-mydomain-cron.timer
Enabling & starting nextcloud-mydomain-cron.timer
Created symlink /etc/systemd/system/timers.target.wants/nextcloud-mydomain-cron.timer → /etc/systemd/system/nextcloud-mydomain-cron.timer.

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

nextcloud-mydomain-cron.service
[Unit]
Description=nextcloud-mydomain-cron

[Service]
Type=oneshot
ExecStart=/usr/bin/docker-compose exec -T -u www-data nextcloud php cron.php
WorkingDirectory=/var/opt/nextcloud-mydomain

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

nextcloud-mydomain-cron.timer
[Unit]
Description=nextcloud-mydomain-cron

[Timer]
OnCalendar=hourly
Persistent=true

[Install]
WantedBy=timers.target

und startet und aktiviert den Timer automatisch. Das bedeutet: Es sind keine weiteren Schritte nach der Ausführung dieses Skripts nötig!

Um den aktuellen Status des Services anzuzeigen, verwende z.B.

show_nextcloud_timer_status.sh
sudo systemctl status nextcloud-mydomain-cron.timer

Beispielausgabe:

nextcloud_timer_status_output.txt
● nextcloud-mydomain-cron.timer - nextcloud-mydomain-cron
      Loaded: loaded (/etc/systemd/system/nextcloud-mydomain-cron.timer; enabled; vendor preset: disabled)
      Active: active (waiting) since Fri 2022-04-01 00:33:48 UTC; 6min ago
     Trigger: Fri 2022-04-01 01:00:00 UTC; 19min left
    Triggers: ● nextcloud-mydomain-cron.service

Apr 01 00:33:48 CoreOS systemd[1]: Started nextcloud-mydomain-cron.

In the

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

Zeile kannst du sehen, wann der Service als Nächstes ausgeführt wird. Standardmäßig erzeugt das Skript Tasks, die OnCalendar=daily verwenden, was bedeutet, dass der Service jeden Tag um 00:00:00 ausgeführt wird. Siehe die systemd.time manpage für weitere Informationen zur Syntax, mit der du andere Zeitintervalle festlegen kannst.

Um das Backup sofort auszuführen (es wird danach weiterhin täglich ausgeführt), führe Folgendes aus

start_nextcloud_service.sh
sudo systemctl start nextcloud-mydomain-cron.service

(beachte, dass du systemctl start auf dem .service ausführen musst! systemctl start auf dem .timer aktiviert nur den Timer und führt den Service nicht sofort aus).

Um die Logs anzuzeigen, verwende

view_nextcloud_logs.sh
sudo journalctl -xfu nextcloud-mydomain-cron.service

(genau wie oben musst du journalctl -xfu auf dem .service ausführen, nicht auf dem .timer).

Um automatische Backups zu deaktivieren, verwende z.B.

disable_nextcloud_timer.sh
sudo systemctl disable nextcloud-mydomain-cron.timer

Quellcode:

create_nextcloud_timer.sh
#!/bin/bash
# Einen systemd-Service & Timer erstellen, der cron.php auf dockerized Nextcloud ausführt
# von Uli Köhler - https://techoverflow.net
# Lizenziert als CC0 1.0 Universal
export SERVICENAME=$(basename $(pwd))-cron

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

echo "Erstelle systemd-Service... $SERVICEFILE"
sudo cat >$SERVICEFILE <<EOF
[Unit]
Description=$SERVICENAME

[Service]
Type=oneshot
ExecStart=$(which docker-compose) exec -T -u www-data nextcloud php cron.php
WorkingDirectory=$(pwd)
EOF

echo "Erstelle systemd-Timer... $TIMERFILE"
sudo cat >$TIMERFILE <<EOF
[Unit]
Description=$SERVICENAME

[Timer]
OnCalendar=hourly
Persistent=true

[Install]
WantedBy=timers.target
EOF

echo "Aktiviere & starte $SERVICENAME.timer"
sudo systemctl enable $SERVICENAME.timer
sudo systemctl start $SERVICENAME.timer

Check out similar posts by category: Docker, Linux, Nextcloud