Jak vytvořit systemd časovač služby, který spustí Nextcloud cron.php za 10 sekund

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:

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

z 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:

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.

Skript vytvoří /etc/systemd/systemd/nextcloud-mydomain-cron.service obsahující specifikaci co přesně spustit:

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

a /etc/systemd/systemd/nextcloud-mydomain-cron.timer obsahující logiku kdy je .service spuštěn:

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

[Timer]
OnCalendar=hourly
Persistent=true

[Install]
WantedBy=timers.target

a 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ř.

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

Příklad výstupu:

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.

V

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

na řá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

start_nextcloud_service.sh
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

view_nextcloud_logs.sh
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ř.

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

Zdrojový kód:

create_nextcloud_timer.sh
#!/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

Podívejte se na podobné články podle kategorie: Docker Linux Nextcloud