Systemd 是现代 Linux 系统的主流初始化系统,它提供了强大的定时任务功能,比传统 cron 更灵活。
Systemd Timer 由两个部分组成:
- .timer
文件:定义何时触发
- .service
文件:定义触发后执行什么
步骤1:创建服务文件
sudo nano /etc/systemd/system/my-daily-backup.service
内容:
[Unit]
Description=Daily Backup Service
[Service]
Type=simple
ExecStart=/usr/local/bin/backup-script.sh
步骤2:创建定时器文件
sudo nano /etc/systemd/system/my-daily-backup.timer
内容:
[Unit]
Description=Run backup daily at 2:30AM
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
[Install]
WantedBy=timers.target
步骤3:启用并启动定时器
sudo systemctl daemon-reload
sudo systemctl enable my-daily-backup.timer
sudo systemctl start my-daily-backup.timer
systemctl list-timers --all
systemctl status my-daily-backup.timer
systemctl start my-daily-backup.service
journalctl -u my-daily-backup
OnCalendar=*-*-* 14:30:00
OnCalendar=Mon..Fri 09:00:00
OnCalendar=*-*-01 00:00:00
OnBootSec=15min
或 OnUnitActiveSec=1h
虽然 Systemd Timer 更强大,但 crontab 仍然是广泛使用的简单定时任务工具。
* * * * * command_to_execute
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ └── 星期几 (0 - 6) (0是周日)
│ │ │ └───── 月份 (1 - 12)
│ │ └────────── 日 (1 - 31)
│ └─────────────── 小时 (0 - 23)
└──────────────────── 分钟 (0 - 59)
crontab -e
0 2 * * * /path/to/command
*/5 * * * * /path/to/command
0 9 * * 1 /path/to/command
0 0 1,15 * * /path/to/command
30 * * * * /path/to/command
@reboot
:启动时运行@yearly
或 @annually
:每年一次@monthly
:每月一次@weekly
:每周一次@daily
:每天一次@hourly
:每小时一次crontab -l
crontab -r
sudo crontab -u username -e
特性 | Systemd Timer | Crontab |
---|---|---|
精确度 | 毫秒级 | 分钟级 |
依赖关系 | 支持服务依赖 | 不支持 |
日志 | 集成journalctl | 需手动重定向 |
随机延迟 | 内置RandomizedDelaySec | 需手动实现 |
错误处理 | 有失败重试机制 | 无内置机制 |
资源控制 | 可设置CPU/内存限制 | 无 |
跨用户管理 | 需要root权限 | 用户级简单 |
学习曲线 | 较陡峭 | 简单 |
>> /var/log/cron.log 2>&1
到命令末尾Crontab任务不执行
/var/log/cron
或 journalctl -u cron
Systemd Timer不触发
systemctl is-active mytimer.timer
journalctl -u mytimer.timer -u myservice.service
权限问题
User=
指令在Systemd服务文件中指定用户时间不准确
timedatectl
OnCalendar
格式是否正确通过本教程,您应该能够根据需求选择并配置适合的Linux定时任务解决方案。Systemd Timer提供了更现代和强大的功能,而Crontab则保持了简单易用的特点。