1. 首页 > Linux教程 > 正文

Linux教程FG119-systemd定时任务管理(timer)

本文档风哥主要介绍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

timer的主要特点:

  • 精确的时间控制
  • 支持依赖关系
  • 支持日志记录
  • 支持环境变量
  • 支持资源限制

1.2 timer与cron的区别

timer与cron的区别:

  • 精度:timer支持微秒级精度,cron只支持分钟级
  • 依赖关系:timer支持依赖关系,cron不支持
  • 日志记录:timer自动记录日志,cron需要手动配置
  • 环境变量:timer支持环境变量配置,cron支持有限
  • 资源限制:timer支持资源限制,cron不支持

1.3 timer的类型

timer的类型:

  • 实时定时器(Realtime):基于日历时间触发
  • 单调定时器(Monotonic):基于相对时间触发
风哥提示:timer是systemd中的定时器单元,用于在特定时间或间隔触发服务。timer可以替代传统的cron定时任务,提供更强大的定时任务管理功能。

Part02-生产环境规划与建议

2.1 定时任务管理在生产环境的规划

定时任务管理在生产环境的规划要点:

# 定时任务管理生产环境规划
– 合理规划定时任务执行时间
– 避免定时任务冲突
– 配置定时任务依赖关系
– 设置合理的超时时间
– 配置定时任务日志

# 定时任务管理注意事项
– 了解定时任务执行时间
– 配置正确的依赖关系
– 设置合理的超时时间
– 配置资源限制
– 记录定时任务日志

2.2 定时任务管理最佳实践

定时任务管理最佳实践:

  • 时间规划:合理规划定时任务执行时间
  • 避免冲突:避免定时任务冲突
  • 依赖管理:配置定时任务依赖关系
  • 超时设置:设置合理的超时时间
  • 日志记录:配置定时任务日志

2.3 定时任务管理安全配置建议

定时任务管理安全配置建议:

  • 最小权限:使用最小权限运行定时任务
  • 资源限制:配置资源限制
  • 安全加固:启用安全加固选项
  • 日志审计:启用日志审计
  • 访问控制:配置访问控制
生产环境建议:合理规划定时任务执行时间,避免定时任务冲突,配置定时任务依赖关系,设置合理的超时时间。学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 timer基础操作详解

3.1.1 查看所有timer

# 查看所有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

# 启动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

# 手动触发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日志

# 查看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配置示例

# 1. 创建服务单元
# 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

风哥提示:timer支持多种高级配置,如实时定时器、单调定时器、完整的timer配置等。学习交流加群风哥QQ113257174

Part04-生产案例与实战讲解

4.1 创建定时任务实战案例

4.1.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 迁移示例

# 1. 原有的cron任务
# 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不触发

# 问题现象: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配置语法
# – 检查关联服务配置

生产环境建议:定时任务故障排查需要耐心和细致。timer不触发需要检查timer是否已启用和启动。更多学习教程公众号风哥教程itpux_com

Part05-风哥经验总结与分享

5.1 定时任务管理经验总结

定时任务管理经验总结:

  • 时间规划:合理规划定时任务执行时间
  • 避免冲突:避免定时任务冲突
  • 依赖管理:配置定时任务依赖关系
  • 超时设置:设置合理的超时时间
  • 日志记录:配置定时任务日志

5.2 定时任务管理检查清单

定时任务管理检查清单:

  • 配置前:了解定时任务执行时间
  • 配置时:检查timer配置语法
  • 配置后:验证timer状态
  • 使用时:定期检查timer状态
  • 维护时:定期更新timer配置
  • 故障排查:检查timer状态、查看日志

5.3 定时任务管理相关工具推荐

定时任务管理相关工具推荐:

  • systemctl:systemd控制命令
  • journalctl:systemd日志查看命令
  • crontab:传统定时任务工具
  • at:一次性定时任务工具
  • anacron:异步定时任务工具
风哥提示:timer是systemd中的定时器单元,用于在特定时间或间隔触发服务。timer可以替代传统的cron定时任务,提供更强大的定时任务管理功能。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息