ssh를 통해 여러 머신에 loggs하고 호스트 이름을 표시하고 명령을 실행하는 Bash 스크립트를 작성하려고합니다 (모든 머신에서 동일한 명령). 명령의 호스트 이름과 출력이 함께 표시되어야합니다. 병렬 버전을 원했기 때문에 ssh 명령은 백그라운드에서 병렬로 실행해야합니다.Bash : 서브 프로세스 액세스 변수
아래와 같이 bashscripted를 구성했습니다. 문제는 다음과 같습니다. runonip
-function이 하위 셸에서 실행되므로 결과를 저장하기 위해 DATA
배열에 액세스 할 수 없습니다. 함수에 대한 "참조에 의한 전달"을 통해 아마도 서브 셸에 Array에 대한 액세스를 제공 할 수 있습니까?
코드 :
#!/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 [email protected] &
#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;
Coprocesses 명확하게 바로이 문제와 다른 사람에 의해 발명되었다 - 멋진! –