Linux 下如何设置随机的定时任务

教程笔记 wes 1 hour ago (2026-08-29) 8 views
📑 本文导航

 

Linux 下如何设置随机的定时任务,比如 5-30 分钟随机间隔执行一个任务。

重点:crontab 没有 “随机间隔” 语法。crontab 是按日历时间触发(几点几分),不能实现「上一次执行完,再等 5‑30 分钟随机时间再跑」。 两种主流实现:

  1. 循环脚本 + sleep 随机(真正的间隔随机,推荐):任务执行完毕后,休眠一段随机时间再跑下一轮。
  2. crontab 高频触发 + 随机概率:不是间隔,是时间片抽签,两次执行可能离得很近。

方式一:常驻循环脚本(真实 5‑30min 随机间隔)

5 分钟 = 300 秒,30 分钟 = 1800 秒,随机区间:300 ~ 1800 秒。

编写脚本 random_loop.sh

#!/bin/bash

# 可加锁防止重复启动
LOCK_FILE="/tmp/random_task.lock"
if [[ -f "${LOCK_FILE}" ]]; then
    echo "进程已在运行,退出"
    exit 1
fi
trap 'rm -f "${LOCK_FILE}"; exit 0' SIGINT SIGTERM
touch "${LOCK_FILE}"

while true
do
    # =========这里替换为你的实际任务命令=========
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始执行任务"
    # /bin/your_command_here
    # ===========================================

    # 生成 5‑30分钟随机秒数 300 ~ 1800
    RAND_SLEEP=$(( 300 + RANDOM % (1800 - 300 + 1) ))
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 休眠 $RAND_SLEEP 秒后再次运行"
    sleep "${RAND_SLEEP}"
done

rm -f "${LOCK_FILE}"

赋权

chmod +x /opt/random_loop.sh

开机自启两种选择

选项 A:crontab @reboot(简单,崩溃不会自动重启)

crontab -e

@reboot /opt/random_loop.sh >> /var/log/random_loop.log 2>&1

缺点:脚本被杀后,只能重启机器才恢复。适合测试、个人服务器。

选项 B:systemd service(生产推荐,崩溃自动重启)

新建 /etc/systemd/system/random-task.service

[Unit]
Description=Random interval task 5‑30min
After=network.target

[Service]
Type=simple
ExecStart=/opt/random_loop.sh
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

生效启动:

systemctl daemon-reload
systemctl enable --now random-task.service
# 查看日志
journalctl -u random-task.service -f

方式二:crontab 定时抽签(不常驻进程,⚠️不是 “间隔”)

特点:每 N 分钟扫描一次,掷骰子决定要不要跑。不能保证距离上次执行是 5‑30 分钟,有可能连续两次挨很近,也可能很久不跑。

crontab -e,每 5 分钟跑一次包装脚本

*/5 * * * * /opt/task_wrapper.sh >> /var/log/task_wrapper.log 2>&1

/opt/task_wrapper.sh

#!/bin/bash
# 随机 0‑100,25%概率执行,可自行调概率
if (( RANDOM % 100 < 25 )); then
    echo "[$(date)] 抽签命中,执行任务"
    # 你的任务命令
fi
chmod +x /opt/task_wrapper.sh

关键概念区分

  1. 执行完成后等待随机时长(方式一)

任务 A 结束 → sleep (5‑30min) → 任务 A,两次任务之间间隔严格落在 5‑30 分钟。业务想要 “随机间隔” 选这个。

  1. ❌ crontab */xx:固定日历时间点触发,不是间隔

小调试命令

# 测试随机秒数输出
echo $(( 300 + RANDOM % (1800 - 300 + 1) ))