Linux实现每15秒执行一次任务的定时器配置指南

admin
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文件:

Linux实现每15秒执行一次任务的定时器配置指南

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>

注意事项

  1. 任务执行时间:若任务执行时间超过15秒,可能导致下次任务被延迟(systemd timer会等待本次任务完成后再触发下一次),建议通过time命令测量任务耗时,确保执行时间远小于间隔。
  2. 资源消耗:高频任务可能对CPU/IO造成压力,需结合topiotop等工具监控资源使用情况,必要时优化任务逻辑或调整间隔。
  3. 日志管理:长期运行的任务会产生大量日志,建议通过logrotate等工具定期清理日志,避免磁盘占满。

实现Linux每15秒执行一次的任务,systemd Timer方案是首选——它具备秒级精度、稳定性和丰富的管理功能,适合生产环境;而while循环+sleep则更轻量,适合临时或简单场景,根据实际需求选择方案,即可高效实现高频定时任务的自动化管理。

文章版权声明:除非注明,否则均为xmsdn原创文章,转载或复制请以超链接形式并注明出处。

取消
微信二维码
微信二维码
支付宝二维码