Bash脚本不会等待后台作业完成

时间:2014-11-17 08:27:19

标签: bash wait background-process

我在使用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

的输出

1 个答案:

答案 0 :(得分:0)

您必须收集此流程的PID:/usr/bin/perl $DIR/GSU-RTR-sshscript.pl $codesite $ip $operateur $hostname,然后在该PID上收集wait

要在while循环中收集各种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周期中收集了一些pid,然后添加了另一个while周期,类似于我等待那些PIDS终止的第一个周期。