Linux 定时任务:cron 与 systemd timer
以「每天凌晨 5 点定时重启」为例,对比 Linux 下两种定时任务的配置方法:crontab 简单直接,是大多数日常场景的首选;systemd timer 步骤稍多,但更结构化,适合与系统服务深度集成的任务。读完可以直接照抄两种配置,并知道什么场景选哪个。已部署任务的完整移除流程见 systemd 定时任务与服务清理。
方法一:crontab(推荐,最常用)
- 编辑 root 用户的 crontab(重启需要 root 权限):
bash
sudo crontab -e 第一次操作时会让你选择默认编辑器。
- 在文件末尾添加一行:
0 5 * * * /sbin/reboot 0 5 * * *:五个字段依次为 分 时 日 月 周,即每天凌晨 5 点整/sbin/reboot:要执行的命令,写绝对路径
保存退出:vim 按
Esc后输入:wq回车;nano 按Ctrl+X,按Y确认,回车保存。验证任务已添加:
bash
sudo crontab -l 方法二:systemd timer
- 创建 service 文件
/etc/systemd/system/daily-reboot.service,定义「执行什么」:
ini
[Unit]
Description=Daily Reboot
[Service]
Type=oneshot
ExecStart=/usr/sbin/reboot Type=oneshot 表示一次性任务,执行完即退出。
- 创建同名 timer 文件
/etc/systemd/system/daily-reboot.timer,定义「何时执行」:
ini
[Unit]
Description=Triggers a daily reboot at 5:00 AM
[Timer]
OnCalendar=*-*-* 05:00:00
Persistent=true
[Install]
WantedBy=timers.target OnCalendar=*-*-* 05:00:00:年-月-日 05:00:00,即每天凌晨 5 点Persistent=true:若触发时刻系统处于关机状态,下次开机后立即补执行一次
- 启用并启动 timer:
bash
# 重新加载 systemd 配置,使其识别新文件
sudo systemctl daemon-reload
# 启用(开机自动激活)并启动
sudo systemctl enable daily-reboot.timer
sudo systemctl start daily-reboot.timer - 验证:
bash
sudo systemctl status daily-reboot.timer
sudo systemctl list-timers 日历表达式可用 systemd-analyze calendar "*-*-* 05:00:00" 验证,会输出规范化形式和下次触发时间。
方法对比
| 特性 | crontab | systemd timer |
|---|---|---|
| 简单性 | 一行配置 | 需创建 service + timer 两个文件 |
| 日志 | /var/log/syslog 或 journalctl | journalctl -u xxx.service,更清晰 |
| 灵活性 | 时间语法成熟灵活 | 同样强大,另支持单调定时器(相对启动时间) |
| 依赖管理 | 弱 | 强,可定义与其他服务的依赖关系 |
| 适用场景 | 绝大多数日常自动化任务 | 与系统服务深度集成的复杂任务 |
要点
- 一行搞定、与系统服务无关的任务用 crontab;需要依赖管理、精确日志、错过的触发补执行(
Persistent=true)时用 systemd timer - systemd timer 的 service 与 timer 必须同名,
daemon-reload不可省 - 日历表达式拿不准时,先用
systemd-analyze calendar验证再写入配置