把 cron 作业迁移到 Debian 的 systemd timer(定时器),本质上就是用 .service + .timer 两个 unit 文件,替代原来的 crontab 条目。下面按步骤说明。
| cron | systemd timer |
|---|---|
crontab -e 中的一行 |
一个 .timer + 一个 .service |
| 执行时间表达式 | OnCalendar= |
| 执行命令 | ExecStart= |
| 日志 | journalctl |
| 用户级任务 | --user 定时器 |
假设原有 cron:
0 2 * * * /usr/local/bin/backup.sh
表示 每天 02:00 执行 backup.sh
系统级(推荐):
sudo nano /etc/systemd/system/backup.service
内容:
[Unit]
Description=Backup script
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
如果是用户级:
mkdir -p ~/.config/systemd/user nano ~/.config/systemd/user/backup.service
sudo nano /etc/systemd/system/backup.timer
内容:
[Unit]
Description=Run backup daily at 2am
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
Unit=backup.service
[Install]
WantedBy=timers.target
说明:
OnCalendar 替代 cron 时间Persistent=true:如果系统关机错过时间,开机后补跑Unit= 指定要跑的 servicesudo systemctl daemon-reexec
sudo systemctl enable --now backup.timer
查看状态:
systemctl list-timers
systemctl status backup.timer
journalctl -u backup.service
journalctl -u backup.timer
| cron | OnCalendar |
|---|---|
0 2 * * * |
*-*-* 02:00:00 |
*/5 * * * * |
*:0/5 |
0 0 * * 1 |
Mon *-*-* 00:00:00 |
30 9 1 * * |
*-*-01 09:30:00 |
systemctl --user enable --now backup.timer
注意:
loginctl enable-linger 用户名✅ 适合迁移:
❌ 不太适合:
如果你愿意,可以把 你的 crontab 内容贴出来,我可以直接帮你生成对应的 systemd 文件。