systemd.timer是现代Linux推荐的定时任务方案,通过.service文件定义任务内容、.timer文件设定执行时间,相比cron具备更优的日志集成、依赖管理、持久化执行、灵活时间表达及资源控制等优势。

在Linux系统里,当我们想让某个任务定时自动跑起来,最先想到的大概就是
cron
systemd
systemd.timer
systemd.timer
.service
.timer
crontab
配置一个
systemd.timer
创建服务单元文件(.service):这个文件描述了你要执行的具体任务。 假设你的脚本在
/usr/local/bin/my_daily_backup.sh
backupuser
/etc/systemd/system/
my-daily-backup.service
# /etc/systemd/system/my-daily-backup.service [Unit] Description=My Daily Backup Script # 确保在网络可用后才尝试运行,如果你的脚本依赖网络 After=network-online.target Wants=network-online.target [Service] # 执行的命令,请使用绝对路径 ExecStart=/usr/local/bin/my_daily_backup.sh # 指定运行任务的用户和组,增强安全性 User=backupuser Group=backupuser # 可选:定义工作目录 WorkingDirectory=/home/backupuser/ # 可选:标准输出和错误输出可以重定向到journald,或者你也可以重定向到文件 StandardOutput=journal StandardError=journal # 如果任务失败,可以配置重启策略,例如:on-failure, always Restart=on-failure # 如果ExecStart是长时间运行的进程,可以设置为forking Type=simple [Install] # 通常服务单元不需要Install段,因为它们由timer单元来“拉起”
创建计时器单元文件(.timer):这个文件定义了
my-daily-backup.service
/etc/systemd/system/
my-daily-backup.timer
# /etc/systemd/system/my-daily-backup.timer [Unit] Description=Runs My Daily Backup Script Daily # 确保在对应的服务单元加载后才激活计时器 Requires=my-daily-backup.service After=my-daily-backup.service [Timer] # 定义定时执行的规则,这里是每天凌晨2点15分 # 语法非常灵活,可以参考 systemd.timer 手册页 OnCalendar=daily # 也可以是:OnCalendar=*-*-* 02:15:00 # 或 OnCalendar=Mon..Fri 02:15:00 (周一到周五) # 如果系统关机时错过了运行时间,在系统启动后立即运行一次 Persistent=true # 允许随机延迟,避免所有定时任务同时启动造成瞬时负载高峰 RandomizedDelaySec=15min # 任务启动的精确度,例如,设置为1分钟意味着任务可能在指定时间前后1分钟内启动 AccuracySec=1min [Install] # 这告诉systemd,当enable这个timer时,它应该被timers.target拉起 WantedBy=timers.target
启用并启动计时器: 创建完文件后,需要通知
systemd
sudo systemctl daemon-reload sudo systemctl enable my-daily-backup.timer sudo systemctl start my-daily-backup.timer
现在,你的每日备份任务就会在每天凌晨2点15分(或稍有随机延迟)自动运行了。
说实话,我个人觉得
systemd.timer
cron
systemd
cron
首先,日志管理。
cron
systemd.timer
journald
journalctl -u my-daily-backup.service
其次,依赖管理。这是
cron
cron
systemd.timer
After
Wants
network-online.target
再者,可靠性与持久性。
systemd.timer
Persistent=true
Persistent=true
cron
还有,时间表达的灵活性。
cron
systemd.timer
OnCalendar
OnBootSec
OnUnitActiveSec
最后,资源控制与安全性。
systemd
User
Group
cron
嗯,光知道优势还不够,真正动手写的时候,细节才是关键。一个典型的
systemd
.service
.timer
/etc/systemd/system/
systemd
我们来拆解一下它们的结构和常用配置项:
1. .service
这个文件描述了你的定时任务具体要执行什么命令,以及以什么环境运行。
# 文件名示例:/etc/systemd/system/my-cleanup.service [Unit] # 描述这个服务是干什么的,方便识别 Description=My Daily System Cleanup Script # 依赖关系:表示这个服务应该在network-online.target之后启动, # 如果你的脚本需要网络,这是个好习惯。 # After=network-online.target # 如果需要某个特定服务先启动,比如数据库,可以这样: # After=postgresql.service # 如果这个服务是某个timer的“从属”服务,可以这样指明: # PartOf=my-cleanup.timer [Service] # 执行类型,通常用simple,表示ExecStart是主进程 Type=simple # 核心:要执行的命令。务必使用绝对路径! # 例如:ExecStart=/usr/local/bin/my_cleanup_script.sh # 如果命令带参数,就像这样:ExecStart=/usr/bin/python3 /opt/myapp/script.py --config /etc/myapp/config.ini ExecStart=/bin/bash -c "/usr/local/bin/my_cleanup_script.sh >> /var/log/my_cleanup.log 2>&1" # 指定运行此命令的用户和组,强烈推荐使用非root用户 User=cleanupuser Group=cleanupuser # 任务的工作目录 WorkingDirectory=/tmp # 标准输出和错误输出的处理方式,通常设置为journal,便于通过journalctl查看 StandardOutput=journal StandardError=journal # 如果任务失败(非零退出码),是否重启。on-failure 比较常用。 Restart=on-failure # 重启前等待的时间 RestartSec=5s # 任务执行的超时时间,如果超时会被强制终止 TimeoutStartSec=5min # 限制资源,比如内存 # MemoryMax=100M # CPUQuota=10% # 如果脚本是一个长时间运行的守护进程,需要设置为forking # Type=forking # PIDFile=/var/run/mydaemon.pid [Install] # 如果这个服务是单独启动的,可以定义WantedBy。 # 但对于timer调用的服务,通常不需要这个段,因为它是由timer拉起的。 # WantedBy=multi-user.target
2. .timer
这个文件定义了
systemd
.service
# 文件名示例:/etc/systemd/system/my-cleanup.timer [Unit] # 描述这个计时器是干什么的 Description=Runs My Daily System Cleanup Timer # 依赖关系:确保对应的服务单元已经加载并可用 Requires=my-cleanup.service After=my-cleanup.service [Timer] # 最常用的定时器设置:基于日历时间。语法非常灵活。 # 每天凌晨3点0分执行 OnCalendar=daily # 也可以这样:OnCalendar=*-*-* 03:00:00 # 每周日凌晨1点执行 # OnCalendar=Sun 01:00:00 # 每月1号和15号的下午2点执行 # OnCalendar=*-*-1,15 14:00:00 # 每隔5分钟执行一次(注意:这表示从timer启动时算起,每隔5分钟) # OnCalendar=minutely/5 # 如果系统关机或任务错过执行,在系统启动后立即执行一次。非常重要! Persistent=true # 随机延迟,防止所有定时任务在同一秒启动,造成瞬时负载峰值 # RandomizedDelaySec=1h # 最多延迟1小时 RandomizedDelaySec=10min # 任务执行的精确度。例如,设置为1分钟,表示任务会在指定时间前后1分钟内启动 AccuracySec=1min # 也可以基于系统启动时间或上一次激活时间来定时 # OnBootSec=10min # 系统启动10分钟后执行一次 # OnUnitActiveSec=1h # 服务上次激活1小时后执行一次 [Install] # 这是让systemd知道如何启用这个timer的。 # timers.target 是所有定时器单元的通用目标。 WantedBy=timers.target
编写这些文件时,记得使用绝对路径,并且给脚本加上执行权限(
chmod +x your_script.sh
sudo systemctl daemon-reload
enable
start
.timer
我个人遇到过不少次,任务就是不跑,或者跑了但没达到预期,结果发现是路径不对、权限问题,或者时间没设对。调试
systemd.timer
systemd
检查单元状态: 这是最基本的,也是第一步。你需要检查你的
.timer
.service
systemctl status my-cleanup.timer
systemctl status my-cleanup.service
查看日志:
systemd
journalctl
journalctl -u my-cleanup.service
journalctl -u my-cleanup.timer
-f
-n 100
手动触发服务: 如果怀疑是脚本本身的问题,而不是定时器的问题,你可以尝试手动启动服务单元,看看它是否能正常运行。
sudo systemctl start my-cleanup.service
列出所有计时器: 想知道系统里所有
systemd.timer
systemctl list-timers --all
OnCalendar
语法检查: 有时候,单元文件里一个小小的拼写错误或者格式问题,就能让整个单元无法加载。
sudo systemd-analyze verify /etc/systemd/system/my-cleanup.service
sudo systemd-analyze verify /etc/systemd/system/my-cleanup.timer
检查脚本权限和路径: 这是最常见的“低级错误”。
chmod +x /usr/local/bin/my_cleanup_script.sh
ExecStart
User
Group
通过这些方法,通常都能定位到
systemd.timer
以上就是如何在Linux中配置定时任务 Linux systemd.timer替代cron的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号