我在使用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 :(得分: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终止的第一个周期。