如何使用 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 重启。"If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow