Linux实现15秒级定时任务需突破cron的分钟级限制,常用两种方法:一是通过脚本循环执行,如while true; do 任务; sleep 15; done,配合nohup后台运行或加入systemctl管理;二是使用systemd Timer,创建.service文件定义任务,再创建.timer文件设置OnCalendar=*:*:0/15,通过systemctl enable --now timer启动,需注意脚本路径权限、日志记录及进程守护,确保任务稳定持续执行。
在Linux运维与自动化场景中,定时任务是不可或缺的功能——无论是数据监控、日志清理,还是周期性数据同步,都需要依赖定时工具实现任务的自动化执行,常见的cron工具虽然强大,但其最小调度单位为分钟,无法满足“每15秒执行一次”这类高频秒级任务的需求,本文将介绍两种主流方案,帮助你在Linux系统中实现每15秒精确运行一次任务的定时器配置。
systemd Timer方案(推荐)
systemd作为现代Linux发行版的默认系统管理器,其提供的timer单元支持秒级精度调度,且具备依赖管理、日志记录等高级功能,是高频定时任务的理想选择,以下是具体配置步骤:
创建任务服务单元(.service)
定义要执行的具体任务,假设我们需要每15秒执行一个/usr/local/bin/task.sh脚本(脚本内容可自定义,如echo "任务执行于:$(date)" >> /var/log/task.log),需创建对应的.service文件:

sudo vim /etc/systemd/system/task15s.service
如下(根据实际脚本路径调整):
[Unit] Description=每15秒执行一次的任务服务 After=network.target [Service] Type=simple ExecStart=/usr/local/bin/task.sh Restart=always RestartSec=10 User=root Group=root
参数说明:
ExecStart:要执行的脚本/命令路径;Restart=always:任务失败时自动重启;User/Group:执行任务的用户/组(建议使用非root用户降低风险)。
创建定时器单元(.timer)
创建.timer文件定义调度规则,实现每15秒触发一次服务:
sudo vim /etc/systemd/system/task15s.timer
如下:
[Unit] Description=每15秒触发task15s.service的定时器 Requires=task15s.service [Timer] OnCalendar=*:*:0/15 AccuracySec=1ms Persistent=true [Install] WantedBy=timers.target
关键参数解析:
OnCalendar=*:*:0/15:核心调度规则,表示“每分钟的0秒、15秒、30秒、45秒触发”(代表任意,0/15表示从0开始每隔15秒);AccuracySec=1ms:任务执行精度误差(默认1秒,此处调整为1毫秒提升精确性);Persistent=true:若定时器启动时错过上次执行时间,会立即补执行一次(避免任务遗漏)。
启用并启动定时器
保存文件后,执行以下命令加载配置并启动定时器:
# 重新加载systemd配置 sudo systemctl daemon-reload # 启用定时器(开机自启) sudo systemctl enable task15s.timer # 立即启动定时器 sudo systemctl start task15s.timer
验证定时器状态
通过以下命令检查定时器是否正常运行:
# 查看定时器状态(应显示“active (waiting)”) sudo systemctl status task15s.timer # 查看最近触发记录(显示“Next:”字段确认下次执行时间) sudo systemctl list-timers --all # 查看任务执行日志(确认脚本是否正常执行) sudo journalctl -u task15s.service -f
while循环结合sleep方案(轻量级替代)
若无需systemd的复杂功能(如开机自启、依赖管理),也可通过while循环+sleep实现简单的高频定时任务,适合临时调试或轻量场景。
编写循环脚本
创建脚本文件(如/usr/local/bin/task_loop.sh):
#!/bin/bash
while true; do
/usr/local/bin/task.sh # 替换为实际任务命令
sleep 15 # 休眠15秒
done
赋予执行权限并运行
chmod +x /usr/local/bin/task_loop.sh # 后台运行(避免终端关闭后脚本停止) nohup /usr/local/bin/task_loop.sh > /var/log/task_loop.log 2>&1 &
停止脚本
若需停止任务,可通过进程ID(PID)终止:
# 查看进程PID ps aux | grep task_loop.sh # 终止进程 kill <PID>
注意事项
- 任务执行时间:若任务执行时间超过15秒,可能导致下次任务被延迟(systemd timer会等待本次任务完成后再触发下一次),建议通过
time命令测量任务耗时,确保执行时间远小于间隔。 - 资源消耗:高频任务可能对CPU/IO造成压力,需结合
top、iotop等工具监控资源使用情况,必要时优化任务逻辑或调整间隔。 - 日志管理:长期运行的任务会产生大量日志,建议通过
logrotate等工具定期清理日志,避免磁盘占满。
实现Linux每15秒执行一次的任务,systemd Timer方案是首选——它具备秒级精度、稳定性和丰富的管理功能,适合生产环境;而while循环+sleep则更轻量,适合临时或简单场景,根据实际需求选择方案,即可高效实现高频定时任务的自动化管理。

