Linux实现每30秒定时任务的方法主要有三种:一是结合cron与sleep循环,通过@reboot启动脚本,用while循环搭配sleep 30实现持续执行;二是使用systemd timer,配置.timer单元,设置OnCalendar=*:*:0/30,支持秒级精确触发,适合长期服务;三是watch命令,如watch -n 30 command,每30秒执行一次,简单易用但适合临时任务,其中systemd timer功能最完善,可依赖管理;watch命令最轻量;循环脚本则灵活性高,可根据需求调整。在Linux系统中,定时任务通常用于周期性执行脚本或命令,常见的crontab工具虽然强大,但其最小时间单位是分钟(无法实现秒级定时),如果需要每30秒运行一次任务,就需要借助其他方法,本文将介绍3种常用的实现方式,包括Shell脚本循环、systemd定时器、Python脚本定时,并附上具体操作步骤和注意事项。
Shell脚本循环实现(简单直接)
原理说明
通过while循环结合sleep命令,让脚本每执行完一次任务后休眠30秒,从而实现周期性运行,这种方法无需额外依赖,适合快速实现简单的秒级定时任务。
操作步骤
编写定时任务脚本
创建一个Shell脚本(如/usr/local/bin/task_30s.sh如下:

#!/bin/bash
# 日志文件路径(可选,用于记录任务执行情况)
LOG_FILE="/var/log/task_30s.log"
while true; do
# 在此处填写需要执行的具体命令或脚本
# 示例:输出当前时间到日志文件
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 执行任务" >> "$LOG_FILE"
# 示例:执行一个自定义脚本(如备份脚本)
# /path/to/your/script.sh
# 休眠30秒
sleep 30
done
赋予脚本执行权限
chmod +x /usr/local/bin/task_30s.sh
后台运行脚本
为了让脚本在终端关闭后仍能持续运行,可以使用以下方式之一:
-
方式1:
nohup(不挂断运行)nohup /usr/local/bin/task_30s.sh > /dev/null 2>&1 &
说明:
> /dev/null 2>&1表示将标准输出和错误输出丢弃(可根据需求改为日志文件路径,如>> $LOG_FILE)。 -
方式2:
screen/tmux(会话持久化)
首先安装screen(sudo apt install screen或sudo yum install screen),然后创建新会话:screen -S task_30s
在会话中运行脚本:
/usr/local/bin/task_30s.sh
按
Ctrl+A+Ddetached会话,后续可通过screen -r task_30s重新进入。
停止脚本
如果需要停止任务,可通过ps命令查找进程ID(PID)并终止:
ps aux | grep task_30s.sh # 找到PID(如第二列的数字) kill -9 <PID> # 强制终止进程
优缺点
- 优点:简单、无需额外依赖,适合临时或简单任务。
- 缺点:需手动管理进程(终端关闭后需重新启动),且无法像
systemd一样实现开机自启。
systemd定时器实现(生产环境推荐)
原理说明
systemd是Linux系统的主要初始化系统,其Timer单元可以精确控制任务的触发时间(支持秒级),通过创建.service(服务定义)和.timer(定时器定义)两个文件,可实现开机自启、日志管理、依赖控制等功能,适合生产环境。
操作步骤
创建服务文件(.service)
定义要执行的任务内容,文件路径为/etc/systemd/system/task_30s.service:
[Unit] Description=Run task every 30 seconds After=network.target # 可选:确保网络启动后执行(如任务依赖网络) [Service] Type=simple ExecStart=/usr/local/bin/task_30s.sh # 替换为实际脚本或命令 User=root # 可选:指定运行用户(如普通用户可改为`nobody`) Group=root Restart=always # 任务失败后自动重启 RestartSec=10s # 重启前等待10秒 StandardOutput=journal # 输出到systemd日志(可通过journalctl查看) StandardError=journal
创建定时器文件(.timer)
定义触发规则(每30秒执行一次),文件路径为/etc/systemd/system/task_30s.timer:
[Unit] Description=Trigger task_30s.service every 30 seconds Requires=task_30s.service # 依赖的服务 [Timer] OnCalendar=*:*:00/30 # 触发规则:每分钟的0秒和30秒(即每30秒) AccuracySec=1s # 允许的最大时间误差(默认1秒,可调整) [Install] WantedBy=timers.target # 安装到timers.target

