Bash无限循环睡眠有奇怪的行为(NGINX / PHP-FPM / PGSQL)

时间:2013-09-13 14:03:49

标签: multithreading bash curl nginx

我不确定它应该在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.在DBtable的PHP页面请求中,有一个列线程。所以这三个循环查询同一个表(读/写)但从不相同的行。

我遇到的问题是,在某些夜晚(几乎没有活动),一个循环不会在几个小时内请求页面(我在NGINX访问日志中检查过)。这种情况有时只会发生,而且服务器的功能比实际需要的还要强大。

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

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

谢谢!

2 个答案:

答案 0 :(得分:1)

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

您应该使用curl's --max-time parameter来限制任何单次执行的持续时间。它预计秒。

e.g。

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

请注意,您现在可能会遇到失败,而您却看到了长时间的延迟。检查输出可能对您的应用程序来说是令人满意的,但返回代码是启示的途径。您甚至可能希望在shebang中使用“-e”选项和/或创建一个与trap ERR一起使用的处理程序。

答案 1 :(得分:0)

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

curl -m 50 ...