<ol><li>使用 systemd 定时器实现服务定时重启需创建 .service 和 .timer 两个单元文件;2. 将 my-app.service 放入 /etc/systemd/system/ 并定义启动、停止命令及运行用户;3. 创建 my-app.timer 文件,设置 oncalendar=--* 03:00:00 实现每日凌晨 3 点触发,unit=my-app.service 指定目标服务,persistent=true 确保错过的任务在系统恢复后执行;4. 执行 sudo systemctl daemon-reload、enable 和 start 命令激活定时器;5. systemd 定时器优于 cron 的主要体现在:与服务系统无缝集成,日志和状态可通过 systemctl 和 journalctl 统一管理;支持环境变量、依赖关系和资源控制;具备 persistent 机制避免任务遗漏;6. 调试时使用 systemctl list-timers --all 查看所有定时器状态,systemctl status my-app.timer 检查具体定时器信息,journalctl -u my-app.service 分析服务执行日志;7. 高级功能包括:randomsec 实现随机延迟以分散集群负载,onbootsec 设置开机后延迟执行,onunitactivesec 基于服务运行时长触发,path/mount 单元实现文件或挂载点变化触发,oncalendar 支持灵活日历表达式如 mon..fri 18:00 或 weekly。通过这些机制,systemd 定时器提供了比 cron 更可靠、可维护和功能丰富的定时任务解决方案。</li></ol>

实现服务定时重启,使用
systemd
timer
cron
systemd
要通过
systemd
systemd
.service
systemd
.timer
假设我们要定时重启一个名为
my-app
步骤:
创建或确认服务单元 (.service
systemd
/etc/systemd/system/
my-app.service
# /etc/systemd/system/my-app.service [Unit] Description=My Custom Application After=network.target # 确保网络就绪后启动 [Service] ExecStart=/usr/local/bin/my-app-start.sh # 你的服务启动脚本或命令 ExecStop=/usr/local/bin/my-app-stop.sh # 你的服务停止脚本或命令 (可选,但推荐) Restart=on-failure # 服务失败时自动重启 User=myuser # 运行服务的用户 Group=myuser # 运行服务的用户组 [Install] WantedBy=multi-user.target
创建定时器单元 (.timer
.timer
/etc/systemd/system/
my-app.timer
假设我们希望每天凌晨 3 点重启
my-app.service
# /etc/systemd/system/my-app.timer [Unit] Description=Daily restart timer for My Custom Application RefuseManualStop=true # 可选,防止意外手动停止这个定时器 [Timer] OnCalendar=*-*-* 03:00:00 # 每天凌晨 3 点执行 Persistent=true # 如果系统在 3 点关机,开机后会立即执行错过的任务 Unit=my-app.service # 当定时器触发时,激活这个服务 AccuracySec=1min # 定时器的精度,默认 1 秒,1 分钟通常足够 [Install] WantedBy=timers.target
OnCalendar
Unit
Persistent=true
激活并启动定时器 创建完文件后,需要让
systemd
sudo systemctl daemon-reload # 重新加载 systemd 配置 sudo systemctl enable my-app.timer # 设置定时器开机自启动 sudo systemctl start my-app.timer # 立即启动定时器
通过这些步骤,你的
my-app.service
systemd
我觉得,相比
cron
systemd
首先,它与
systemd
cron
cron
systemd
systemd
systemd
systemd
journalctl
systemctl
syslog
cron
journalctl -u your-service.service
journalctl -u your-timer.timer
其次,可控性和灵活性也远超
cron
systemd
cron
cron
还有就是它的持久性(Persistent=true
cron
systemd
Persistent=true
最后,
systemd
AccuracySec
systemd
systemd
cron
在实际运维中,能够快速调试和查看
systemd
最直接的方法是使用
systemctl list-timers --all
如果你想深入了解某个特定定时器的状态,比如
my-app.timer
systemctl status my-app.timer
enable
start
日志是排查问题的黄金标准。当定时器触发服务时,服务的输出都会被
journalctl
journalctl -u my-app.service
journalctl -u my-app.timer
cron
/var/log/syslog
如果我想测试服务本身能不能正常启动,而不想等待定时器触发,我可以直接用
systemctl start my-app.service
另外,如果定时器没有触发,除了检查
systemctl status
journalctl -u systemd
journalctl -b
systemd
systemd
cron
一个我觉得非常棒的功能是随机延迟(RandomSec
[Timer]
RandomSec=300
RandomSec
另一个很有用的场景是开机后延迟(OnBootSec
OnBootSec=10min
还有基于服务状态的触发,比如上次执行后延迟(OnUnitActiveSec
OnUnitInactiveSec
OnUnitActiveSec=1h
cron
虽然不是直接的
timer
systemd
Path
Mount
Path
Mount
systemd
最后,
OnCalendar
*-*-* 03:00:00
Mon..Fri 18:00
weekly
monthly
*-*-* 00:00:00/2
cron
以上就是如何实现服务定时重启 systemd定时器替代cron的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号