4

即使在我的专用服务器上,我也无法将 cron 时间设置为小于 1 分钟。我需要它每 15 秒运行一次,因为它调用 betfair api 并且计算高度依赖于时间。请指教。

4

3 回答 3

11

如果您需要每 15 秒调用一次作业,请不要使用 cron。cron 是为请求稍后完成的工作而设计的。

相反,在父级完成作业后,休眠 15 秒,然后调用子脚本,然后退出。子脚本可以完成它的工作,休眠 15 秒然后调用下一个脚本。起泡,冲洗,重复。

如果您的服务器没有时间限制,那么您甚至不需要生成子脚本。只睡 15 秒,做你的事,睡 15 秒,做下一件事,依此类推。睡眠脚本不会消耗 CPU,但会消耗 RAM。但这比循环主机的 PID 要好;这可能会让你的主人感到不安。

于 2010-09-22T06:08:52.027 回答
7

Cron 只能让您以每分钟一次的速度运行。

我要做的是在你的脚本中进行 15 秒的计时。

  • 每分钟执行一次父脚本。
  • 在该脚本存在之前每 15 秒执行一次子脚本,然后开始新的循环。
于 2010-09-22T06:03:23.673 回答
1

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.
于 2010-09-22T06:51:59.857 回答