如何在 10 秒内创建运行 Nextcloud cron.php 的 systemd 服务定时器
本文向你展示一种非常快速的方法来创建在 dockerized nextcloud(使用 docker-compose)上运行 cron.php 的 systemd 定时器。我们创建了一个脚本,使用我们之前文章如何在基于 docker-compose 的设置中运行 Nextcloud cron中的命令自动创建 systemd 定时器和相关服务来每小时运行 cron.php:
为了运行我们的自动安装脚本,运行:
wget -qO- https://techoverflow.net/scripts/install-nextcloud-cron.sh | sudo bash /dev/stdin从 docker-compose.yml 所在的目录运行。注意脚本将使用目录名作为创建的服务和定时器的名称。例如,在 /var/lib/nextcloud-mydomain 中运行脚本将导致 nextcloud-mydomain-cron 被用作服务名。
脚本的示例输出:
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,包含确切运行什么的规范:
[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 的逻辑:
[Unit]
Description=nextcloud-mydomain-cron
[Timer]
OnCalendar=hourly
Persistent=true
[Install]
WantedBy=timers.target并将自动启动和启用定时器。这意味着:运行此脚本后无需进一步步骤!
为了显示服务的当前状态,使用例如
sudo systemctl status nextcloud-mydomain-cron.timer示例输出:
● 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.在
Trigger: Fri 2020-12-11 00:00:00 CET; 20h left行中你可以看到服务下次运行的时间。默认情况下,脚本生成运行 OnCalendar=daily 的任务,这意味着服务将在每天的 00:00:00 运行。查看systemd.time manpage获取有关可用于指定其他时间范围的语法的更多信息。
为了立即运行备份(这样做后它仍将每天运行),执行
sudo systemctl start nextcloud-mydomain-cron.service(注意你需要在 .service 上运行 systemctl start!在 .timer 上运行 systemctl start 只会启用定时器而不会立即运行服务)。
为了查看日志,使用
sudo journalctl -xfu nextcloud-mydomain-cron.service(就像上面一样,你需要在 .service 上运行 journalctl -xfu,而不是在 .timer 上)。
为了禁用自动备份,使用例如
sudo systemctl disable nextcloud-mydomain-cron.timer源代码:
#!/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