이것은 nvidia-smi
여러 호스트 에서 명령 을 실행 하고 해당 출력을 공통 파일에 저장 하는 간단한 스크립트입니다 . 여기서 목표는 비동기식으로 실행하는 것 입니다.
인가 &
의 말에 process_host()
기능을 충분 전화? 내 스크립트가 맞습니까?
#!/bin/bash
HOSTS=(host1 host2 host3)
OUTPUT_FILE=nvidia_smi.txt
rm $OUTPUT_FILE
process_host() {
host=$1
echo "Processing" $host
output=`ssh ${host} nvidia-smi`
echo ${host} >> $OUTPUT_FILE
echo "$output" >> $OUTPUT_FILE
}
for host in ${HOSTS[@]}; do
process_host ${host} &
done;
wait
cat $OUTPUT_FILE
답변
예. 그러나 출력이 왜곡 될 수 있습니다. 호스트 이름에 따라 함수가 출력을 특정 파일에 기록한 다음 기본 스크립트가 결과를 연결하고 정리하도록하는 것이 좋습니다.
또한 변수를 큰 따옴표로 묶어야합니다. 스크립트를 복사하여 ShellCheck에 붙여 넣 습니다 .
아마도 이런 식으로 뭔가 :
#!/bin/bash
hosts=( host1 host2 host3 )
outfile="nvidia_smi.txt"
rm -f "$outfile"
function process_host {
local host="$1"
local hostout="$host.out"
printf "Processing host '%s'\n" "$host"
echo "$host" >"$hostout"
ssh "$host" nvidia-smi >>"$hostout"
}
for host in "${hosts[@]}"; do
process_host "$host" &
done
wait
for host in "${hosts[@]}"; do
hostout="$host.out"
cat "$hostout"
rm -f "$hostout"
done >"$outfile"
cat "$outfile"
마지막 루프는
cat "${hosts[@]/%/.out}" >"$outfile"
rm -f "${hosts[@]/%/.out}"