2014-11-17 2 views
2

У меня проблемы с многопроцессорной работой с BASH.Сценарий Bash не дожидается завершения фоновых заданий

У меня есть функция, которая делает это:

#Fait appel au script SSH pour le passage de commandes 
sendSSHrequests() { 
    temp_info=$($mysql --skip-column-names -h $db_address -P $db_port -u $db_user -p$db_passwd $db_name -e "select $db_site_table.code_site, ip_routeur, operateur, hostname from $db_site_table, $db_routeur_table where $db_site_table.code_site=$db_routeur_table.code_site and $db_site_table.ip_routeur NOT IN (select ip from $db_erreur_table) AND $db_site_table.code_site REGEXP '([GM][0-9]$)';") 
    while read codesite ip operateur hostname 
    do 
     (sleep 3; /usr/bin/perl $DIR/GSU-RTR-sshscript.pl $codesite $ip $operateur $hostname) & 
     ((current_proc_ssh++)) 
     if [ $current_proc_ssh -eq $max_proc_ssh ]; then 
      printf "Pausing with $max_proc_ssh processes...\n" 
      current_proc_ssh=0 
      wait 
     fi 
    done<<<"$temp_info" 
    wait 
} 

Но на самом деле, это wait не работает. Как я могу это увидеть? Потому что в моей «основной» части у меня есть это:

echo "----------------------demarrage---------------------------------" 
date 
sendSSHrequests 
sh $DIR/GSU-RTR-recursiveCall.sh 
echo "-------------------------fin------------------------------------" 

И когда функция sendSSHrequests по-прежнему использует дочерние процессы, у меня есть выходы из сценария GSU-RTR-recursiveCall.sh

+0

На всякий случай - правильно ли заполняется '$ temp_info' (т. Е. Возвращает результат вызова mysql')? –

+0

Да, это так. Где условия убедитесь, что маршрутизатор не объявлен «ошибкой» в ошибке таблицы. Если нет, информация на 100% надежна –

+0

Рассмотрите возможность использования GNU Parallel - она ​​идеально подходит для этой задачи. –

ответ

0

Вам необходимо собрать PID этого процесса: /usr/bin/perl $DIR/GSU-RTR-sshscript.pl $codesite $ip $operateur $hostname, а затем wait на этом PID.

Для сбора различных PIDS в то время цикла, вы должны установить переменные динамически, используя eval, пожалуйста, попробуйте следующее решение:

#Fait appel au script SSH pour le passage de commandes 
sendSSHrequests() { 
    temp_info=$($mysql --skip-column-names -h $db_address -P $db_port -u $db_user -p$db_passwd $db_name -e "select $db_site_table.code_site, ip_routeur, operateur, hostname from $db_site_table, $db_routeur_table where $db_site_table.code_site=$db_routeur_table.code_site and $db_site_table.ip_routeur NOT IN (select ip from $db_erreur_table) AND $db_site_table.code_site REGEXP '([GM][0-9]$)';") 
    while read codesite ip operateur hostname 
    do 
     (sleep 3; /usr/bin/perl $DIR/GSU-RTR-sshscript.pl $codesite $ip $operateur $hostname; MY_PID=$!; eval $(printf "pid_$codesite_$ip_$operateur_$hostname=$MYPID")) & 
     ((current_proc_ssh++)) 
     if [ $current_proc_ssh -eq $max_proc_ssh ]; then 
      printf "Pausing with $max_proc_ssh processes...\n" 
      current_proc_ssh=0 
     fi 
    done<<<"$temp_info" 

    ####### I added the following loop ######## 
    while read codesite ip operateur hostname 
    do 
     wait pid_$codesite_$ip_$operateur_$hostname 
    done<<<"$temp_info" 


} 

Я удалил ваши wait команд и собрал некоторый ИДП в первом while цикла, затем добавили еще один цикл while, похожий на первый, где я ждал завершения этих PIDS.