即使在我的专用服务器上,我也无法将 cron 时间设置为小于 1 分钟。我需要它每 15 秒运行一次,因为它调用 betfair api 并且计算高度依赖于时间。请指教。
3 回答
如果您需要每 15 秒调用一次作业,请不要使用 cron。cron 是为请求稍后完成的工作而设计的。
相反,在父级完成作业后,休眠 15 秒,然后调用子脚本,然后退出。子脚本可以完成它的工作,休眠 15 秒然后调用下一个脚本。起泡,冲洗,重复。
如果您的服务器没有时间限制,那么您甚至不需要生成子脚本。只睡 15 秒,做你的事,睡 15 秒,做下一件事,依此类推。睡眠脚本不会消耗 CPU,但会消耗 RAM。但这比循环主机的 PID 要好;这可能会让你的主人感到不安。
Cron 只能让您以每分钟一次的速度运行。
我要做的是在你的脚本中进行 15 秒的计时。
- 每分钟执行一次父脚本。
- 在该脚本存在之前每 15 秒执行一次子脚本,然后开始新的循环。
Cron 是一个作业调度程序,它被构建为具有至少一分钟的分辨率。如果您需要比这更精细的解决方案,您要么必须找到另一个调度工具,要么自己动手。
我过去使用过的一个如下。您配置所需的间隙和最小间隙,以下脚本将每秒钟执行一次您的有效负载N
。请注意,这不是简单的“N
每次迭代之间等待几秒钟”调度程序。它实际上在前一个迭代开始N
后几秒钟开始下一次迭代,而不是在结束后。
存在最小间隙,因此,如果您的有效负载花费的时间超过N
几秒钟,则它不会连续运行它。如果您确实希望它在这种情况下连续运行,只需将最小间隙设置为 0。
执行此操作的代码在这里:
#!/usr/bin/bash
payload() {
if [[ $1 -eq 1 ]] ; then
echo "Sleeping for 1 second at $(date +%H:%M:%S)."
else
if [[ $1 -lt 10 ]] ; then
echo "Sleeping for $1 seconds at $(date +%H:%M:%S)."
else
echo "Sleeping for $1 seconds at $(date +%H:%M:%S)."
fi
fi
sleep $1
echo " Finished at $(date +%H:%M:%S)."
echo
}
gap=10
mingap=3
for i in {1..20} ; do
next=$(($(date +%s) + ${gap}))
payload ${i}
if [[ ${mingap} -ne 0 ]] ; then
sleep ${mingap}
fi
while [[ $(date +%s) -lt ${next} ]] ; do
sleep 1
done
done
有效负载不是逻辑的一部分,它只是我在那里用于调试目的的东西。你可以用任何你想要的替换它。此外,for
循环也是一个示例。您可以用无限循环替换它,或者让脚本只执行(例如)60 分钟的迭代,cron
每小时启动一个新的脚本实例。
示例运行如下。您可以看到有效负载每 10 秒运行一次(由于 的变幻莫测,奇数的 11 秒sleep
),直到它需要超过 7 秒才能完成。那时,最小的差距开始了。
Sleeping for 1 second at 14:36:08.
Finished at 14:36:09.
Sleeping for 2 seconds at 14:36:18.
Finished at 14:36:20.
Sleeping for 3 seconds at 14:36:28.
Finished at 14:36:31.
Sleeping for 4 seconds at 14:36:39.
Finished at 14:36:43.
Sleeping for 5 seconds at 14:36:49.
Finished at 14:36:54.
Sleeping for 6 seconds at 14:37:00.
Finished at 14:37:06.
Sleeping for 7 seconds at 14:37:10.
Finished at 14:37:17.
Sleeping for 8 seconds at 14:37:20.
Finished at 14:37:28.
Sleeping for 9 seconds at 14:37:31.
Finished at 14:37:41.
Sleeping for 10 seconds at 14:37:44.
Finished at 14:37:54.
Sleeping for 11 seconds at 14:37:57.
Finished at 14:38:08.
Sleeping for 12 seconds at 14:38:11.
Finished at 14:38:23.
Sleeping for 13 seconds at 14:38:27.
Finished at 14:38:40.
Sleeping for 14 seconds at 14:38:43.
Finished at 14:38:57.
Sleeping for 15 seconds at 14:39:00.
Finished at 14:39:15.
Sleeping for 16 seconds at 14:39:18.
Finished at 14:39:34.
Sleeping for 17 seconds at 14:39:38.
Finished at 14:39:55.
Sleeping for 18 seconds at 14:39:58.
Finished at 14:40:16.
Sleeping for 19 seconds at 14:40:19.
Finished at 14:40:38.
Sleeping for 20 seconds at 14:40:41.
Finished at 14:41:02.