如何在 10 秒内创建 systemd 备份定时器和服务
在我们之前的文章在 10 秒内为你的 docker-compose 项目创建 systemd 服务中,我们介绍了一个自动创建 systemd 服务来启动基于 docker-compose 的项目的脚本。在这篇文章中,我们将展示
**首先,**你需要在 docker-compose.yml 所在的目录中创建一个名为 backup.sh 的文件。此文件将每天由 systemd 服务运行。该文件包含什么完全取决于你,我们将在未来的博文中提供示例。
其次,运行
wget -qO- https://techoverflow.net/scripts/create-backup-service.sh | sudo bash /dev/stdin从 docker-compose.yml 所在的目录运行。注意脚本将使用目录名作为创建的服务和定时器的名称。例如,在 /var/lib/redmine-mydomain 中运行脚本将导致 redmine-mydomain-backup 被用作服务名称。
脚本的示例输出:
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,包含具体运行什么的规范:
[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 的逻辑:
[Unit]
Description=redmine-mydomain-backup
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target并将自动启动和启用定时器。这意味着:运行此脚本后无需进一步步骤!
为了显示服务的当前状态,使用例如
sudo systemctl status redmine-mydomain-backup.timer示例输出:
● 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.在
Trigger: Fri 2020-12-11 00:00:00 CET; 20h left行中你可以看到服务下次何时运行。默认情况下,脚本生成运行 OnCalendar=daily 的任务,这意味着服务将在每天的 00:00:00 运行。查看 systemd.time 手册页 获取有关可用于指定其他时间段的语法的更多信息。
为了立即运行备份(这样做后它仍将每天运行),执行
sudo systemctl start redmine-mydomain-backup.service(注意你需要在 .service 上运行 systemctl start!在 .timer 上运行 systemctl start 只会启用定时器而不会立即运行服务)。
为了查看日志,使用
sudo journalctl -xfu redmine-mydomain-backup.service(就像上面一样,你需要在 .service 上运行 journalctl -xfu,而不是在 .timer 上)。
为了禁用自动备份,使用例如
sudo systemctl disable redmine-mydomain-backup.timer源代码:
#!/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