如何在 10 秒内创建运行 Nextcloud cron.php 的 systemd 服务定时器

本文向你展示一种非常快速的方法来创建在 dockerized nextcloud(使用 docker-compose)上运行 cron.php 的 systemd 定时器。我们创建了一个脚本,使用我们之前文章如何在基于 docker-compose 的设置中运行 Nextcloud cron中的命令自动创建 systemd 定时器和相关服务来每小时运行 cron.php

为了运行我们的自动安装脚本,运行:

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

docker-compose.yml 所在的目录运行。注意脚本将使用目录名作为创建的服务和定时器的名称。例如,在 /var/lib/nextcloud-mydomain 中运行脚本将导致 nextcloud-mydomain-cron 被用作服务名。

脚本的示例输出:

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.

脚本将创建 /etc/systemd/systemd/nextcloud-mydomain-cron.service,包含确切运行什么的规范:

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

/etc/systemd/systemd/nextcloud-mydomain-cron.timer,包含何时启动 .service 的逻辑:

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

[Timer]
OnCalendar=hourly
Persistent=true

[Install]
WantedBy=timers.target

并将自动启动和启用定时器。这意味着:运行此脚本后无需进一步步骤!

为了显示服务的当前状态,使用例如

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

示例输出:

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.

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

行中你可以看到服务下次运行的时间。默认情况下,脚本生成运行 OnCalendar=daily 的任务,这意味着服务将在每天的 00:00:00 运行。查看systemd.time manpage获取有关可用于指定其他时间范围的语法的更多信息。

为了立即运行备份(这样做后它仍将每天运行),执行

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

(注意你需要在 .service 上运行 systemctl start!在 .timer 上运行 systemctl start 只会启用定时器而不会立即运行服务)。

为了查看日志,使用

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

(就像上面一样,你需要在 .service 上运行 journalctl -xfu,而不是在 .timer 上)。

为了禁用自动备份,使用例如

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

源代码:

create_nextcloud_timer.sh
#!/bin/bash
# 创建在 dockerized nextcloud 上运行 cron.php 的 systemd 服务和定时器
# by Uli Köhler - https://techoverflow.net
# 许可为 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

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