the*_*ega 4 parallel-processing bash scope
我想写一个Bash-Script,它通过ssh登录到几台机器,首先显示它们的主机名并执行一个命令(在每台机器上都是相同的命令).命令的主机名和输出应一起显示.我想要一个并行版本,所以ssh-commands应该在后台和并行运行.
我构建了下面附带的bashscripted.问题是:由于runonip-function在子shell中执行,因此无法访问DATA-array来存储结果.以某种方式可能通过"通过引用传递"函数给子shell访问数组吗?
码:
#!/bin/bash
set -u
if [ $# -eq 0 ]; then
echo "Need Arguments: Command to run"
exit 1
fi
DATA=""
PIDS=""
#Function to run in Background for each ip
function runonip {
ip="$1"
no="$2"
cmds="$3"
DATA[$no]=$( {
echo "Connecting to $ip"
ssh $ip cat /etc/hostname
ssh $ip $cmds
} 2>&1 )
}
ips=$(get ips somewhere)
i=0
for ip in $ips; do
#Initialize Variables
i=$(($i+1))
DATA[$i]="n/a"
#For the RunOnIp Function to background
runonip $ip $i $@ &
#Save PID for later waiting
PIDS[$i]="$!"
done
#Wait for all SubProcesses
for job in ${PIDS[@]}; do
wait $job
done
#Everybody finished, so output the information from DATA
for x in `seq 1 $i`; do
echo ${DATA[$x]}
done;
Run Code Online (Sandbox Code Playgroud)
不,它真的不是.子shell在完全独立的操作系统进程中运行,两个进程共享内存的唯一方法是让代码通过系统调用显式设置.Bash不这样做.
您需要做的是找到两个进程进行通信的其他方法.以PID命名的临时文件将是一种方式:
#For the RunOnIp Function to background
runonip $ip $i $@ >data-tmp&
mv data-tmp data-$!
Run Code Online (Sandbox Code Playgroud)
然后cat文件:
#Everybody finished, so output the information from the temp files
for x in ${PIDS[@]}; do
cat data-$x
rm data-$x
done;
Run Code Online (Sandbox Code Playgroud)