Bash fork重试:资源暂时不可用

时间:2014-05-22 09:44:06

标签: bash loops fork

我有一个简单的BASH程序:

max_proc_snmpget=30
getHostnamesFromRouter() {
    while [ `find $proc_dir -name snmpgetproc* | wc -l` -ge "$max_proc_snmpget" ];do
    {
        echo "sleeping, fping in progress";
        sleep 1;
    }
    done

    temp_ip=$($mysql --skip-column-names -h $db_address -u $db_user -p$db_passwd $db_name -e "select ip_routeur,code_site from $db_vtiger_table where $db_vtiger_table.ip_routeur NOT IN (select ip from $db_erreur_table);")
    while read ip codesite;do
    {
        sendSNMPGET $ip $snmp_community $code_site &
    }
    done<<<"$temp_ip"
}

sendSNMPGET() {
    touch $procdir/snmpgetproc.$$
    hostname=`snmpget -v1 -c $2 $1 sysName.0`
    if [ "$hostname" != "" ]
    then
        #$mysql -h $db_address -u $db_user -p$db_passwd $db_name -e "insert into $db_routeur_table (hostname,code_site,ip) VALUES ($hostname,$1,$3);"
        echo "kikou"
    fi
    rm -f $procdir/snmpgetproc.$$
}

启动时,程序从SQL表读取4999行,然后应该启动最多30个线程来启动“sendSNMPGET”函数。

这不是什么东西。

控制台变得疯狂并发送了很多:

./scan-snmp.sh: fork: Resource temporarily unavailable
./scan-snmp.sh: fork: Resource temporarily unavailable
./scan-snmp.sh: fork: Resource temporarily unavailable
./scan-snmp.sh: fork: Resource temporarily unavailable
./scan-snmp.sh: fork: Resource temporarily unavailable
./scan-snmp.sh: fork: Resource temporarily unavailable
./scan-snmp.sh: fork: Resource temporarily unavailable
./scan-snmp.sh: fork: Resource temporarily unavailable
kikou
kikou
kikou
kikou
kikou
kikou

我在其他脚本中有类似的功能(为每个线程创建一个文件并用var限制它)没有这个问题。

2 个答案:

答案 0 :(得分:0)

输入&#39;工作&#39;在shell提示符下。 以前运行此脚本后剩余多少个作业? 我猜测在测试时你已经在每次运行脚本后遗留了工作,并且在运行脚本几次之后就会有太多的工作。

&#34; fork:资源暂时不可用&#34;意味着您正在达到系统限制。我在内存不足时看到它,或者你可能不允许使用sub-=进程。输入&#39; ulimit -a&#39;检查限制。

另外。 。 。 您的脚本中没有任何内容将temp_ip限制为仅30个条目? 你可以记录temp_ip有多大(echo $ temp_ip | wc -l)。 您可以使用head -30或mysql来确保最多返回30个条目吗?

function testfunc {  echo testfunc;  sleep 30;  echo testfunc END; }
temp_ip="a b
c d
e f
g h
i j
k l
m n
o p
q r
s t
u v
w x
y z
a b
c d
e f
g h
i j
k l
m n
o p
q r
s t
u v
w x
y z
a b
c d
e f
g h"

现在重复一遍。 。 。几次并检查工作&#39;

while read ip codesite;do     { echo $ip; testfunc $ip & }
done<<<"$temp_ip"

如果进程ulimit为1024,我似乎可以在故障开始之前运行15次。在遇到问题之前,我在列表中得到了大约450个

麻烦是这样的:

-bash: fork: retry: Resource temporarily unavailable
testfunc
-bash: fork: retry: No child processes
testfunc
-bash: fork: retry: No child processes
testfunc
-bash: fork: retry: No child processes

答案 1 :(得分:0)

我会在你的循环中添加sleep,这应该给每个分支足够的时间来完成。如果您尝试快速做到这一点并不是最有效的,但如果时间不是那么重要,那么这可能是您的选择。