如何在 10 秒内创建 systemd 备份定时器和服务

在我们之前的文章在 10 秒内为你的 docker-compose 项目创建 systemd 服务中,我们介绍了一个自动创建 systemd 服务来启动基于 docker-compose 的项目的脚本。在这篇文章中,我们将展示

**首先,**你需要在 docker-compose.yml 所在的目录中创建一个名为 backup.sh 的文件。此文件将每天由 systemd 服务运行。该文件包含什么完全取决于你,我们将在未来的博文中提供示例。

其次,运行

create-backup-service.sh
wget -qO- https://techoverflow.net/scripts/create-backup-service.sh | sudo bash /dev/stdin

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

脚本的示例输出:

output.txt
Creating systemd service... /etc/systemd/system/redmine-mydomain-backup.service
Creating systemd timer... /etc/systemd/system/redmine-mydomain-backup.timer
Enabling & starting redmine-mydomain-backup.timer
Created symlink /etc/systemd/system/timers.target.wants/redmine-mydomain-backup.timer → /etc/systemd/system/redmine-mydomain-backup.timer.

脚本将创建 /etc/systemd/systemd/redmine-mydomain-backup.service,包含具体运行什么的规范:

redmine-mydomain-backup.service
[Unit]
Description=redmine-mydomain-backup

[Service]
Type=oneshot
ExecStart=/bin/bash backup.sh
WorkingDirectory=/var/lib/redmine-mydomain

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

redmine-mydomain-backup.timer
[Unit]
Description=redmine-mydomain-backup

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

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

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

status.sh
sudo systemctl status redmine-mydomain-backup.timer

示例输出:

output.txt
● redmine-mydomain-backup.timer - redmine-mydomain-backup
      Loaded: loaded (/etc/systemd/system/redmine-mydomain-backup.timer; enabled; vendor preset: enabled)
      Active: active (waiting) since Thu 2020-12-10 02:50:31 CET; 19min ago
     Trigger: Fri 2020-12-11 00:00:00 CET; 20h left
    Triggers: ● redmine-mydomain-backup.service

Dec 10 02:50:31 myserverhostname systemd[1]: Started redmine-mydomain-backup.

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

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

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

start_backup.sh
sudo systemctl start redmine-mydomain-backup.service

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

为了查看日志,使用

journal.sh
sudo journalctl -xfu redmine-mydomain-backup.service

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

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

disable_timer.sh
sudo systemctl disable redmine-mydomain-backup.timer

源代码:

create-backup-service.sh
#!/bin/bash
# 创建每天运行给定备份的 systemd 服务和定时器
# 作者 Uli Köhler - https://techoverflow.net
# 许可为 CC0 1.0 Universal
export SERVICENAME=$(basename $(pwd))-backup

export SERVICEFILE=/etc/systemd/system/${SERVICENAME}.service
export TIMERFILE=/etc/systemd/system/${SERVICENAME}.timer

echo "创建 systemd 服务... $SERVICEFILE"
sudo cat >$SERVICEFILE <<EOF
[Unit]
Description=$SERVICENAME

[Service]
Type=oneshot
ExecStart=/bin/bash backup.sh
WorkingDirectory=$(pwd)
EOF

echo "创建 systemd 定时器... $TIMERFILE"
sudo cat >$TIMERFILE <<EOF
[Unit]
Description=$SERVICENAME

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
EOF

echo "启用并启动 $SERVICENAME.timer"
sudo systemctl enable $SERVICENAME.timer
sudo systemctl start $SERVICENAME.timer

Check out similar posts by category: Docker, Linux