我有一个简单的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限制它)没有这个问题。
答案 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
,这应该给每个分支足够的时间来完成。如果您尝试快速做到这一点并不是最有效的,但如果时间不是那么重要,那么这可能是您的选择。