Linux crontab每秒执行
要在 Linux 中每 30 秒运行一次 cron 作业,可以通过以下两种方法实现:
方法一:利用 crontab
的多任务调度
由于 cron 最小时间单位是 1 分钟,可通过在同一分钟内多次触发任务并用 sleep
延迟执行。
示例:每 30 秒运行一次
# 编辑 crontabcrontab -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:创建脚本
sudo vi /opt/every-x-seconds.sh
内容如下:
#!/bin/bash
if [[ $# != 2 ]]; then echo "Usage: $0 <interval_seconds> <command>" exit 1fi
while true; do "$2" # 执行命令 sleep "$1" # 等待指定间隔done
赋予执行权限:
sudo chmod +x /opt/every-x-seconds.sh
步骤 2:以后台模式运行
使用 screen
或 nohup
保持脚本运行:
# 使用 screen(需安装)sudo apt install -y screenscreen -S cron_loop/opt/every-x-seconds.sh 30 date # 每30秒运行 date# 按 Ctrl+A 后按 D 退出 screen 会话
或使用 nohup
:
nohup /opt/every-x-seconds.sh 30 date >/dev/null 2>&1 &
方法对比
方法 | 优点 | 缺点 |
---|---|---|
Crontab | 无需额外脚本,依赖系统自带 | 间隔≥1分钟,多任务条目管理复杂 |
Shell 脚本 | 支持任意间隔,逻辑简单 | 需手动维护进程,异常终止需重启 |
注意事项
- 精度问题:两种方法均无法保证绝对精确的间隔(受系统负载影响)。
- 日志管理:建议将输出重定向到文件,避免控制台堆积。
- 长期运行:使用脚本时,推荐结合
systemd
或supervisord
实现进程守护。