首页/系统/Linux 运维命令速查/场景:把 crontab 迁移成 systemd timer
定时任务与计划50 条

场景:把 crontab 迁移成 systemd timer

迁移五步:盘点任务、写 service、写 timer、启用验证、下线 cron 行;用真实例子把「每日 02:30 备份」完整搬过去。

Linux 运维命令速查系统更新于 2026-10-12
场景cron 迁移 timer
产物xx.service + xx.timer
要点先并存验证再删旧任务

1) service

1) service
# /etc/systemd/system/db-backup.service
[Unit]
Description=Daily DB backup
After=network-online.target mysql.service
Wants=network-online.target

[Service]
Type=oneshot
User=backup
ExecStart=/opt/scripts/db-backup.sh
Nice=10
IOSchedulingClass=idle

2) timer + 3) 启用

2) timer + 3) 启用
# /etc/systemd/system/db-backup.timer
[Unit]
Description=Run db-backup daily

[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
RandomizedDelaySec=300

[Install]
WantedBy=timers.target

# 启用
sudo systemctl daemon-reload
sudo systemctl enable --now db-backup.timer
systemctl list-timers db-backup.timer --no-pager

4) 验证与 5) 下线

4) 验证与 5) 下线
sudo systemctl start db-backup.service          # 手动触发一次验证
journalctl -u db-backup.service --since today --no-pager | tail
# 验证通过后删除旧 crontab 行(先备份)
crontab -l > ~/cron.bak && crontab -e
迁移期两套并存会重复执行:cron 行改成 echo skipped 观察一天,或直接停旧任务一天后再删。

易错点

  • Type=oneshot 是任务型 service 的必备写法,默认 simple 会误判执行状态
  • 迁移后日志去 journal:确保 journald 持久化(/var/log/journal 存在),否则重启后历史不可查

数据来源与参考

  • systemd 官方文档:Timers
  • man 5 systemd.service
  • man 5 systemd.timer

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌