如何使用 systemd 定时器每周重启 systemd 服务

下面的示例使用 systemd 定时器,在每周日 06:00 重启服务。

最简单的使用方式是运行下方的自动安装脚本,它会创建所需文件并启用定时器。如果你想手动创建,请将 .timer.service 文件复制到 /etc/systemd/system/,使用 systemctl daemon-reload 重新加载 systemd,然后使用 systemctl enable --now myservice-restart.timer 启用并启动定时器。

别忘了在所有文件中将 myservice 替换为你服务的实际名称!

服务文件示例

myservice-restart.service
[Unit]
Description=Restart myservice

[Service]
Type=oneshot
ExecStart=/bin/systemctl restart myservice

定时器文件示例

myservice-restart.timer
[Unit]
Description=Restart myservice every Sunday at 06:00

[Timer]
OnCalendar=Sun *-*-* 06:00:00  # 此处不允许行内注释!
Persistent=true

[Install]
WantedBy=timers.target

自动安装脚本

install-weekly-autorestart.sh
#!/bin/bash

# TODO 在此处定义服务名称
SERVICE_NAME="myservice"
# 可选配置
TIMER_NAME="${SERVICE_NAME}-restart"
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
TIMER_FILE="/etc/systemd/system/${TIMER_NAME}.timer"
SERVICE_RESTART_FILE="/etc/systemd/system/${TIMER_NAME}.service"

# 检查脚本是否以 root 身份运行
if [ "$(id -u)" -ne 0 ]; then
    echo "错误:此脚本必须以 root 身份运行(请使用 sudo)。" >&2
    exit 1
fi

# 检查目标服务是否存在
if [ ! -f "$SERVICE_FILE" ]; then
    echo "错误:服务文件 '$SERVICE_FILE' 不存在,请先创建它。" >&2
    exit 1
fi

# 创建定时器服务文件(oneshot 用于重启目标服务)
cat > "$SERVICE_RESTART_FILE" <<EOF
[Unit]
Description=Restart $SERVICE_NAME

[Service]
Type=oneshot
ExecStart=/bin/systemctl restart $SERVICE_NAME
EOF

# 创建定时器文件(OnCalendar 中不允许行内注释!)
cat > "$TIMER_FILE" <<EOF
[Unit]
Description=Restart $SERVICE_NAME every Sunday at 06:00

[Timer]
OnCalendar=Sun *-*-* 06:00:00
Persistent=true

[Install]
WantedBy=timers.target
EOF

# 重新加载 systemd,启用并启动定时器
echo "正在重新加载 systemd..."
systemctl daemon-reload

echo "正在启用并启动定时器..."
systemctl enable --now "$TIMER_NAME.timer"

# 验证定时器是否处于活动状态
echo "正在验证定时器状态..."
systemctl list-timers --all | grep "$TIMER_NAME"

echo "安装完成!"
echo "服务 '$SERVICE_NAME' 现在将在每周日 06:00 重启。"

Check out similar posts by category: Systemd, Linux