Skip to content

Linux crontab每秒执行

要在 Linux 中每 30 秒运行一次 cron 作业,可以通过以下两种方法实现:


方法一:利用 crontab 的多任务调度

由于 cron 最小时间单位是 1 分钟,可通过在同一分钟内多次触发任务并用 sleep 延迟执行。

示例:每 30 秒运行一次

Terminal window
# 编辑 crontab
crontab -e

添加以下两行:

* * * * * date >> /tmp/date.log # 每分钟第0秒运行
* * * * * sleep 30; date >> /tmp/date.log # 每分钟第30秒运行
  • 原理:第一个任务在每分钟的第 0 秒执行,第二个任务在每分钟的第 0 秒启动,但延迟 30 秒后执行。
  • 验证:查看日志文件 /tmp/date.log,或实时跟踪:
    Terminal window
    tail -f /tmp/date.log

其他间隔示例

  • 每 10 秒:添加 6 条任务,sleep 0、10、20、30、40、50 秒。
  • 每 15 秒:添加 4 条任务,sleep 0、15、30、45 秒。
  • 每 20 秒:添加 3 条任务,sleep 0、20、40 秒。

方法二:使用 Shell 脚本循环

通过无限循环实现更灵活的秒级调度。

步骤 1:创建脚本

Terminal window
sudo vi /opt/every-x-seconds.sh

内容如下:

#!/bin/bash
if [[ $# != 2 ]]; then
echo "Usage: $0 <interval_seconds> <command>"
exit 1
fi
while true; do
"$2" # 执行命令
sleep "$1" # 等待指定间隔
done

赋予执行权限:

Terminal window
sudo chmod +x /opt/every-x-seconds.sh

步骤 2:以后台模式运行

使用 screennohup 保持脚本运行:

Terminal window
# 使用 screen(需安装)
sudo apt install -y screen
screen -S cron_loop
/opt/every-x-seconds.sh 30 date # 每30秒运行 date
# 按 Ctrl+A 后按 D 退出 screen 会话

或使用 nohup

Terminal window
nohup /opt/every-x-seconds.sh 30 date >/dev/null 2>&1 &

方法对比

方法优点缺点
Crontab无需额外脚本,依赖系统自带间隔≥1分钟,多任务条目管理复杂
Shell 脚本支持任意间隔,逻辑简单需手动维护进程,异常终止需重启

注意事项

  1. 精度问题:两种方法均无法保证绝对精确的间隔(受系统负载影响)。
  2. 日志管理:建议将输出重定向到文件,避免控制台堆积。
  3. 长期运行:使用脚本时,推荐结合 systemdsupervisord 实现进程守护。