systemd: Service-Timer erstellen, der Nextcloud cron.php in 10 Sekunden ausführt
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:
wget -qO- https://techoverflow.net/scripts/install-nextcloud-cron.sh | sudo bash /dev/stdinim 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:
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:
[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-mydomainund /etc/systemd/systemd/nextcloud-mydomain-cron.timer mit der Logik, wann der .service gestartet wird:
[Unit]
Description=nextcloud-mydomain-cron
[Timer]
OnCalendar=hourly
Persistent=true
[Install]
WantedBy=timers.targetund 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.
sudo systemctl status nextcloud-mydomain-cron.timerBeispielausgabe:
● 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
Trigger: Fri 2020-12-11 00:00:00 CET; 20h leftZeile 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
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
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.
sudo systemctl disable nextcloud-mydomain-cron.timerQuellcode:
#!/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