本文档风哥主要介绍systemd定时任务管理的使用,包括timer的概念、timer与cron的区别、timer的类型、定时任务管理在生产环境的规划、定时任务管理最佳实践、定时任务管理安全配置建议、timer基础操作详解、timer高级使用技巧、timer配置详解、创建定时任务实战案例、从cron迁移到timer实战案例、定时任务故障排查与解决等内容,参考Red Hat Enterprise Linux 10官方文档,适合Linux运维人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 timer的概念
timer是systemd中的定时器单元,用于在特定时间或间隔触发服务。timer可以替代传统的cron定时任务,提供更强大的定时任务管理功能。timer与服务单元(.service)配合使用,当timer触发时,会启动相应的服务。更多视频教程www.fgedu.net.cn
- 精确的时间控制
- 支持依赖关系
- 支持日志记录
- 支持环境变量
- 支持资源限制
1.2 timer与cron的区别
timer与cron的区别:
- 精度:timer支持微秒级精度,cron只支持分钟级
- 依赖关系:timer支持依赖关系,cron不支持
- 日志记录:timer自动记录日志,cron需要手动配置
- 环境变量:timer支持环境变量配置,cron支持有限
- 资源限制:timer支持资源限制,cron不支持
1.3 timer的类型
timer的类型:
- 实时定时器(Realtime):基于日历时间触发
- 单调定时器(Monotonic):基于相对时间触发
Part02-生产环境规划与建议
2.1 定时任务管理在生产环境的规划
定时任务管理在生产环境的规划要点:
– 合理规划定时任务执行时间
– 避免定时任务冲突
– 配置定时任务依赖关系
– 设置合理的超时时间
– 配置定时任务日志
# 定时任务管理注意事项
– 了解定时任务执行时间
– 配置正确的依赖关系
– 设置合理的超时时间
– 配置资源限制
– 记录定时任务日志
2.2 定时任务管理最佳实践
定时任务管理最佳实践:
- 时间规划:合理规划定时任务执行时间
- 避免冲突:避免定时任务冲突
- 依赖管理:配置定时任务依赖关系
- 超时设置:设置合理的超时时间
- 日志记录:配置定时任务日志
2.3 定时任务管理安全配置建议
定时任务管理安全配置建议:
- 最小权限:使用最小权限运行定时任务
- 资源限制:配置资源限制
- 安全加固:启用安全加固选项
- 日志审计:启用日志审计
- 访问控制:配置访问控制
Part03-生产环境项目实施方案
3.1 timer基础操作详解
3.1.1 查看所有timer
# systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Thu 2026-04-01 00:00:00 CST 13h left Wed 2026-03-31 00:00:00 CST 10h ago logrotate.timer logrotate.service
Thu 2026-04-01 00:00:00 CST 13h left Wed 2026-03-31 00:00:00 CST 10h ago unbound-anchor.timer unbound-anchor.service
Thu 2026-04-01 00:00:00 CST 13h left – – dnf-makecache.timer dnf-makecache.service
Thu 2026-04-01 01:00:00 CST 14h left – – mlocate-updatedb.timer mlocate-updatedb.service
Thu 2026-04-01 06:00:00 CST 19h left – – sysstat-collect.timer sysstat-collect.service
Thu 2026-04-01 06:00:00 CST 19h left – – sysstat-summary.timer sysstat-summary.service
6 timers listed.
Pass –all to see loaded but inactive timers, too.
# 查看所有timer(包括未激活的)
# systemctl list-timers –all
# 查看timer详细信息
# systemctl status logrotate.timer
● logrotate.timer – Daily rotation of log files
Loaded: loaded (/usr/lib/systemd/system/logrotate.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Thu 2026-03-31 09:00:00 CST; 1h 30min ago
Trigger: Thu 2026-04-01 00:00:00 CST; 13h left
Mar 31 09:00:00 localhost systemd[1]: Started Daily rotation of log files.
3.1.2 启动、停止、启用、禁用timer
# systemctl start logrotate.timer
# 停止timer
# systemctl stop logrotate.timer
# 启用timer(开机自动启动)
# systemctl enable logrotate.timer
Created symlink /etc/systemd/system/timers.target.wants/logrotate.timer → /usr/lib/systemd/system/logrotate.timer.
# 禁用timer(开机不自动启动)
# systemctl disable logrotate.timer
Removed /etc/systemd/system/timers.target.wants/logrotate.timer.
# 查看timer是否启用
# systemctl is-enabled logrotate.timer
enabled
3.2 timer高级使用技巧
3.2.1 手动触发timer
# systemctl start logrotate.service
# 或者使用timer的触发功能
# systemctl start logrotate.timer
# 查看timer触发历史
# systemctl list-timers –all
NEXT LEFT LAST PASSED UNIT ACTIVATES
Thu 2026-04-01 00:00:00 CST 13h left Wed 2026-03-31 10:30:00 CST 5min ago logrotate.timer logrotate.service
3.2.2 查看timer日志
# journalctl -u logrotate.timer
— Logs begin at Thu 2026-03-31 09:00:00 CST. —
Mar 31 09:00:00 localhost systemd[1]: Started Daily rotation of log files.
Mar 31 10:30:00 localhost systemd[1]: logrotate.service: Succeeded.
Mar 31 10:30:00 localhost systemd[1]: Finished Daily rotation of log files.
# 查看关联服务的日志
# journalctl -u logrotate.service
— Logs begin at Thu 2026-03-31 09:00:00 CST. —
Mar 31 10:30:00 localhost logrotate[1234]: reading config file /etc/logrotate.conf
Mar 31 10:30:00 localhost logrotate[1234]: reading config file /etc/logrotate.d/nginx
Mar 31 10:30:00 localhost logrotate[1234]: reading config file /etc/logrotate.d/syslog
Mar 31 10:30:00 localhost logrotate[1234]: rotating pattern: /var/log/nginx/*.log weekly (52 rotations)
Mar 31 10:30:00 localhost logrotate[1234]: empty log files are not rotated, old logs are removed
Mar 31 10:30:00 localhost logrotate[1234]: considering log /var/log/nginx/access.log
Mar 31 10:30:00 localhost logrotate[1234]: log does not need rotating (log has been already rotated)
3.3 timer配置详解
3.3.1 实时定时器配置
# cat > /etc/systemd/system/backup.timer << 'EOF' [Unit] Description=Daily Backup Timer [Timer] OnCalendar=daily Persistent=true [Install] WantedBy=timers.target EOF # OnCalendar格式说明: # daily:每天执行 # hourly:每小时执行 # weekly:每周执行 # monthly:每月执行 # yearly:每年执行 # *-*-* 02:00:00:每天凌晨2点执行 # Mon *-*-* 02:00:00:每周一凌晨2点执行 # *-*-01 02:00:00:每月1日凌晨2点执行 # *-01-01 02:00:00:每年1月1日凌晨2点执行 # *-*-* 02,14:00:00:每天凌晨2点和下午2点执行 # *-*-* 02:00:00/6:每天从凌晨2点开始,每6小时执行一次
3.3.2 单调定时器配置
# cat > /etc/systemd/system/cleanup.timer << 'EOF' [Unit] Description=Cleanup Timer [Timer] OnBootSec=5min OnUnitActiveSec=1h [Install] WantedBy=timers.target EOF # 单调定时器选项说明: # OnActiveSec:timer激活后多久触发 # OnBootSec:系统启动后多久触发 # OnStartupSec:systemd启动后多久触发 # OnUnitActiveSec:关联服务上次激活后多久触发 # OnUnitInactiveSec:关联服务上次停止后多久触发 # OnCalendar:基于日历时间触发(实时定时器) # AccuracySec:定时器精度 # Persistent:如果系统关机时错过了触发时间,开机后是否立即触发
3.3.3 完整的timer配置示例
# cat > /etc/systemd/system/backup.service << 'EOF' [Unit] Description=Daily Backup Service [Service] Type=oneshot ExecStart=/usr/local/bin/backup.sh User=backup Group=backup EOF # 2. 创建timer单元 # cat > /etc/systemd/system/backup.timer << 'EOF' [Unit] Description=Daily Backup Timer Requires=backup.service [Timer] OnCalendar=daily Persistent=true AccuracySec=1min [Install] WantedBy=timers.target EOF # 3. 创建备份脚本 # cat > /usr/local/bin/backup.sh << 'EOF' #!/bin/bash # 备份脚本 BACKUP_DIR="/backup/$(date +%Y%m%d)" SOURCE_DIR="/data" # 创建备份目录 mkdir -p $BACKUP_DIR # 执行备份 tar czf $BACKUP_DIR/backup.tar.gz $SOURCE_DIR # 记录日志 echo "[$(date)] Backup completed: $BACKUP_DIR/backup.tar.gz" >> /var/log/backup.log
EOF
# 4. 设置脚本执行权限
# chmod +x /usr/local/bin/backup.sh
# 5. 创建备份用户
# useradd -r -s /bin/false backup
# 6. 重新加载systemd配置
# systemctl daemon-reload
# 7. 启用timer
# systemctl enable backup.timer
Created symlink /etc/systemd/system/timers.target.wants/backup.timer → /etc/systemd/system/backup.timer.
# 8. 启动timer
# systemctl start backup.timer
# 9. 查看timer状态
# systemctl status backup.timer
● backup.timer – Daily Backup Timer
Loaded: loaded (/etc/systemd/system/backup.timer; enabled; vendor preset: disabled)
Active: active (waiting) since Thu 2026-03-31 10:00:00 CST; 5min ago
Trigger: Fri 2026-04-01 00:00:00 CST; 14h left
Mar 31 10:00:00 localhost systemd[1]: Started Daily Backup Timer.
# 10. 查看所有timer
# systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Fri 2026-04-01 00:00:00 CST 14h left – – backup.timer backup.service
Thu 2026-04-01 00:00:00 CST 14h left Wed 2026-03-31 00:00:00 CST 10h ago logrotate.timer logrotate.service
Part04-生产案例与实战讲解
4.1 创建定时任务实战案例
4.1.1 创建数据库备份定时任务
# cat > /etc/systemd/system/db-backup.service << 'EOF' [Unit] Description=Database Backup Service After=network.target [Service] Type=oneshot ExecStart=/usr/local/bin/db-backup.sh User=postgres Group=postgres [Install] WantedBy=multi-user.target EOF # 2. 创建数据库备份timer # cat > /etc/systemd/system/db-backup.timer << 'EOF' [Unit] Description=Database Backup Timer Requires=db-backup.service [Timer] OnCalendar=*-*-* 02:00:00 Persistent=true AccuracySec=1min [Install] WantedBy=timers.target EOF # 3. 创建数据库备份脚本 # cat > /usr/local/bin/db-backup.sh << 'EOF' #!/bin/bash # 数据库备份脚本 BACKUP_DIR="/backup/postgres/$(date +%Y%m%d)" DB_NAME="fgedudb" DB_USER="postgres" # 创建备份目录 mkdir -p $BACKUP_DIR # 执行备份 pg_dump -U $DB_USER -d $DB_NAME > $BACKUP_DIR/${DB_NAME}_$(date +%H%M%S).sql
# 压缩备份文件
gzip $BACKUP_DIR/${DB_NAME}_*.sql
# 删除7天前的备份
find /backup/postgres -type d -mtime +7 -exec rm -rf {} \;
# 记录日志
echo “[$(date)] Database backup completed: $BACKUP_DIR” >> /var/log/db-backup.log
EOF
# 4. 设置脚本执行权限
# chmod +x /usr/local/bin/db-backup.sh
# 5. 重新加载systemd配置
# systemctl daemon-reload
# 6. 启用timer
# systemctl enable db-backup.timer
Created symlink /etc/systemd/system/timers.target.wants/db-backup.timer → /etc/systemd/system/db-backup.timer.
# 7. 启动timer
# systemctl start db-backup.timer
# 8. 查看timer状态
# systemctl status db-backup.timer
● db-backup.timer – Database Backup Timer
Loaded: loaded (/etc/systemd/system/db-backup.timer; enabled; vendor preset: disabled)
Active: active (waiting) since Thu 2026-03-31 10:00:00 CST; 5min ago
Trigger: Fri 2026-04-01 02:00:00 CST; 16h left
Mar 31 10:00:00 localhost systemd[1]: Started Database Backup Timer.
# 9. 手动触发备份(测试)
# systemctl start db-backup.service
# 10. 查看备份日志
# journalctl -u db-backup.service
— Logs begin at Thu 2026-03-31 09:00:00 CST. —
Mar 31 10:05:00 localhost db-backup.sh[1234]: [Thu Mar 31 10:05:00 CST 2026] Database backup completed: /backup/postgres/20260331
4.2 从cron迁移到timer实战案例
4.2.1 迁移示例
# crontab -l
# 每天凌晨2点执行备份
0 2 * * * /usr/local/bin/backup.sh
# 每小时执行一次清理
0 * * * * /usr/local/bin/cleanup.sh
# 每周一凌晨3点执行报告生成
0 3 * * 1 /usr/local/bin/report.sh
# 2. 创建备份timer
# cat > /etc/systemd/system/backup.timer << 'EOF'
[Unit]
Description=Daily Backup Timer
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
# 3. 创建清理timer
# cat > /etc/systemd/system/cleanup.timer << 'EOF'
[Unit]
Description=Hourly Cleanup Timer
[Timer]
OnCalendar=hourly
Persistent=true
[Install]
WantedBy=timers.target
EOF
# 4. 创建报告timer
# cat > /etc/systemd/system/report.timer << 'EOF'
[Unit]
Description=Weekly Report Timer
[Timer]
OnCalendar=Mon *-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
EOF
# 5. 创建对应的服务单元
# cat > /etc/systemd/system/backup.service << 'EOF'
[Unit]
Description=Daily Backup Service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
EOF
# cat > /etc/systemd/system/cleanup.service << 'EOF'
[Unit]
Description=Hourly Cleanup Service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/cleanup.sh
EOF
# cat > /etc/systemd/system/report.service << 'EOF'
[Unit]
Description=Weekly Report Service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/report.sh
EOF
# 6. 重新加载systemd配置
# systemctl daemon-reload
# 7. 启用所有timer
# systemctl enable backup.timer cleanup.timer report.timer
Created symlink /etc/systemd/system/timers.target.wants/backup.timer → /etc/systemd/system/backup.timer.
Created symlink /etc/systemd/system/timers.target.wants/cleanup.timer → /etc/systemd/system/cleanup.timer.
Created symlink /etc/systemd/system/timers.target.wants/report.timer → /etc/systemd/system/report.timer.
# 8. 启动所有timer
# systemctl start backup.timer cleanup.timer report.timer
# 9. 查看所有timer
# systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Fri 2026-04-01 00:00:00 CST 14h left - - cleanup.timer cleanup.service
Fri 2026-04-01 02:00:00 CST 16h left - - backup.timer backup.service
Mon 2026-04-03 03:00:00 CST 3 days left - - report.timer report.service
# 10. 删除原有的cron任务
# crontab -r
# 11. 验证迁移完成
# crontab -l
no crontab for root
# systemctl list-timers --all | grep -E "(backup|cleanup|report)"
backup.timer enabled
backup.timer active
backup.timer waiting
cleanup.timer enabled
cleanup.timer active
cleanup.timer waiting
report.timer enabled
report.timer active
report.timer waiting
4.3 定时任务故障排查与解决
4.3.1 timer不触发
# 分析步骤:
# 1. 查看timer状态
# systemctl status backup.timer
● backup.timer – Daily Backup Timer
Loaded: loaded (/etc/systemd/system/backup.timer; enabled; vendor preset: disabled)
Active: inactive (dead)
# 2. 检查timer是否启用
# systemctl is-enabled backup.timer
disabled
# 3. 启用timer
# systemctl enable backup.timer
Created symlink /etc/systemd/system/timers.target.wants/backup.timer → /etc/systemd/system/backup.timer.
# 4. 启动timer
# systemctl start backup.timer
# 5. 验证timer状态
# systemctl status backup.timer
● backup.timer – Daily Backup Timer
Loaded: loaded (/etc/systemd/system/backup.timer; enabled; vendor preset: disabled)
Active: active (waiting) since Thu 2026-03-31 10:00:00 CST; 5min ago
Trigger: Fri 2026-04-01 02:00:00 CST; 16h left
# 6. 检查timer配置
# cat /etc/systemd/system/backup.timer
[Unit]
Description=Daily Backup Timer
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
# 7. 检查关联服务
# systemctl cat backup.service
[Unit]
Description=Daily Backup Service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
# 8. 手动触发测试
# systemctl start backup.service
# journalctl -u backup.service
— Logs begin at Thu 2026-03-31 09:00:00 CST. —
Mar 31 10:05:00 localhost backup.sh[1234]: [Thu Mar 31 10:05:00 CST 2026] Backup completed
# 9. 预防措施
# – 确保timer已启用
# – 确保timer已启动
# – 检查timer配置语法
# – 检查关联服务配置
Part05-风哥经验总结与分享
5.1 定时任务管理经验总结
定时任务管理经验总结:
- 时间规划:合理规划定时任务执行时间
- 避免冲突:避免定时任务冲突
- 依赖管理:配置定时任务依赖关系
- 超时设置:设置合理的超时时间
- 日志记录:配置定时任务日志
5.2 定时任务管理检查清单
定时任务管理检查清单:
- 配置前:了解定时任务执行时间
- 配置时:检查timer配置语法
- 配置后:验证timer状态
- 使用时:定期检查timer状态
- 维护时:定期更新timer配置
- 故障排查:检查timer状态、查看日志
5.3 定时任务管理相关工具推荐
定时任务管理相关工具推荐:
- systemctl:systemd控制命令
- journalctl:systemd日志查看命令
- crontab:传统定时任务工具
- at:一次性定时任务工具
- anacron:异步定时任务工具
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
