2014-05-22 4 views
0

나는이 일을하는 간단한 BASH 프로그램이 있습니다배쉬 포크 재시도 : 자원 일시적으로 사용할 수 없습니다

시작했을 때, 프로그램은 SQL 테이블에서 4999 개 행을 읽어
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.$$ 
} 

, 다음에 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

쉘 프롬프트에서 'jobs'를 입력하십시오. 이 스크립트를 이전에 실행 한 후에 남아있는 작업 수는 얼마입니까? 이 테스트를하는 동안 각 스크립트 실행 후에 작업을 남겨두고 스크립트를 몇 번 실행 한 후에 너무 많은 작업이있는 것으로 추측합니다.

"fork : 리소스를 일시적으로 사용할 수 없음"은 시스템 한도에 도달했음을 의미합니다. 나는 기억이 나지 않을 때 또는 허용 된 하위 프로세스에서 빠져 나올 때 그것을 보았습니다. 제한을 확인하려면 'ulimit -a'를 입력하십시오.

또한. . . 스크립트에는 temp_ip를 단 30 개의 항목으로 제한하는 내용이 없습니다. 아마도 temp_ip의 크기가 얼마나 큰지를 기록 할 수 있습니다 (echo $ temp_ip | wc -l). 헤드 -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" 

이제 이것을 반복하십시오. . . 몇 번이고 '일자리'를 확인하십시오. 1024 프로세스 ulimit를 가진

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

나는 문제가 시작되기 전에이 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 
0

나는 각 포크를 완료 할 수있는 충분한 시간을 제공해야하는, 루프에 sleep을 추가합니다. 당신이 그것을 아주 빨리하는 것을 시도하는 경우에 능률 아닙니다, 그러나 시간이 순전히 중요하지 않은 경우에, 이것은 당신 선택일지도 모르다.

관련 문제