1

我不确定它应该在 stackoverflow 或 serverfault 中。我在这里发帖是因为这可能是一个编程问题。

我有这个无限循环:

#!/bin/bash

MESSAGE="XXX0"
RESULT=`curl "http://somepage.php?thread=0"`

while :
do


    if [[ "$RESULT" == "DONE" ]] 
    then
        RESULT=`curl "http://somepage.php?thread=0"`
    elif [[ "$RESULT" == "NONE" ]] 
    then
        sleep 5
        RESULT=`curl "http://somepage.php?thread=0"`
    else
        printf "%s %s\n" "$(date --rfc-3339='seconds'): ELSE1-" "$RESULT"   >> /var/log/XXX/loopXXX-`date --rfc-3339='date'`
        sleep 5
        RESULT=`curl "http://somepage.php?thread=0"`

        if [[ "$RESULT" == "DONE" ]] 
        then
            RESULT=`curl "http://jsomepage.php?thread=0"`
        elif [[ "$RESULT" == "NONE" ]] 
        then
            sleep 5
            RESULT=`curl "http://somepage.php?thread=0"`
        else
            printf "STOP"
            break
        fi
    fi

done

我有 3 个循环做同样的工作并请求线程 0 到 2。在 PHP 页面请求的 DBtable 中,有一个列线程。所以这三个循环查询同一个表(读/写),但从不查询相同的行。

我遇到的问题是,在某些晚上(几乎没有活动),一个循环在几个小时内都没有请求页面(我检查了 NGINX 访问日志)。这只有时会发生,并且服务器比需要的更强大。

curl 使用无限循环有问题吗?我总共有大约 10 个循环(不同的页面/表),但它们的睡眠时间是 10 秒而不是 5 秒。

我的脚本内存/卷曲有问题吗?你有没有经历过类似的事情?

谢谢!

4

2 回答 2

1

其中一条curl线的执行时间可能比您预期的要长得多。

您应该使用curl'--max-time参数来将任何单次执行的持续时间限制在合理的范围内。它需要几秒钟。

例如

RESULT=`curl --max-time 10 "http://somepage.php?thread=0"`

请注意,您现在可能会遇到失败,而您会看到长时间的延迟。检查输出可能会让您的应用程序满意,但返回码是启蒙之路。您甚至可能想在 shebang 中使用 " " 选项和/或创建一个与for-e一起使用的处理程序。trapERR

于 2013-09-13T14:10:22.643 回答
0

尝试为每个 curl 命令设置最大超时,以防止它们挂起。例子:

curl -m 50 ...
于 2013-09-13T14:07:16.327 回答