Tento příspěvek ukazuje opravdu rychlou metodu, jak vytvořit systemd časovač, který spouští cron.php na Nextcloudu v Dockeru (pomocí docker-compose). Vytvořili jsme skript, který automaticky vytvoří systemd časovač a související službu pro spouštění cron.php každou hodinu pomocí příkazu z našeho předchozího příspěvku Jak spustit cron Nextcloudu v nastavení založeném na docker-compose:
Pro spuštění našeho autoinstalačního skriptu spusťte:
wget -qO- https://techoverflow.net/scripts/install-nextcloud-cron.sh | sudo bash /dev/stdinz adresáře, kde se nachází docker-compose.yml. Všimněte si, že skript použije název adresáře jako název pro službu a časovač, které jsou vytvořeny. Například spuštění skriptu v /var/lib/nextcloud-mydomain způsobí, že nextcloud-mydomain-cron bude použit jako název služby.
Příklad výstupu ze skriptu:
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.Skript vytvoří /etc/systemd/systemd/nextcloud-mydomain-cron.service obsahující specifikaci co přesně spustit:
[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-mydomaina /etc/systemd/systemd/nextcloud-mydomain-cron.timer obsahující logiku kdy je .service spuštěn:
[Unit]
Description=nextcloud-mydomain-cron
[Timer]
OnCalendar=hourly
Persistent=true
[Install]
WantedBy=timers.targeta automaticky spustí a povolí časovač. To znamená: po spuštění tohoto skriptu nejsou potřeba žádné další kroky!
Pro zobrazení aktuálního stavu služby použijte např.
sudo systemctl status nextcloud-mydomain-cron.timerPříklad výstupu:
● 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.V
Trigger: Fri 2020-12-11 00:00:00 CET; 20h leftna řádku můžete vidět, kdy bude služba spuštěna příště. Ve výchozím nastavení skript generuje úlohy, které běží OnCalendar=daily, což znamená, že služba bude spuštěna v 00:00:00 každý den. Přečtěte si manuálovou stránku systemd.time pro další informace o syntaxi, kterou můžete použít pro zadání jiných časových rámců.
Pro okamžité spuštění zálohování (po tomto bude stále běžet denně), udělejte
sudo systemctl start nextcloud-mydomain-cron.service(všimněte si, že musíte spustit systemctl start na .service! Spuštění systemctl start na .timer pouze povolí časovač a nespustí službu okamžitě).
Pro zobrazení logů použijte
sudo journalctl -xfu nextcloud-mydomain-cron.service(jako výše, musíte spustit journalctl -xfu na .service, ne na .timer).
Pro zakázání automatického zálohování použijte např.
sudo systemctl disable nextcloud-mydomain-cron.timerZdrojový kód:
#!/bin/bash
# Vytvoření systemd služby a časovače, které spouští cron.php na Nextcloudu v Dockeru
# by Uli Köhler - https://techoverflow.net
# Licensed as CC0 1.0 Universal
export SERVICENAME=$(basename $(pwd))-cron
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=$(which docker-compose) exec -T -u www-data nextcloud php cron.php
WorkingDirectory=$(pwd)
EOF
echo "Creating systemd timer... $TIMERFILE"
sudo cat >$TIMERFILE <<EOF
[Unit]
Description=$SERVICENAME
[Timer]
OnCalendar=hourly
Persistent=true
[Install]
WantedBy=timers.target
EOF
echo "Enabling & starting $SERVICENAME.timer"
sudo systemctl enable $SERVICENAME.timer
sudo systemctl start $SERVICENAME.timer