백그라운드에서 여러 개의 bash 함수를 실행하고 반환 될 때까지 기다립니다.


14

이것은 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

답변:


13

예. 그러나 출력이 왜곡 될 수 있습니다. 호스트 이름에 따라 함수가 출력을 특정 파일에 기록한 다음 기본 스크립트가 결과를 연결하고 정리하도록하는 것이 좋습니다.

또한 변수를 큰 따옴표로 묶어야합니다. 스크립트를 복사하여 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}"

내가 원하는 결과를 정확히 얻습니다. 여기서 무엇이 잘못 될 수 있습니까?
syntagma

2
@ ΔλЛ 예를 들어 첫 번째 호스트의 응답 속도가 느린 경우의 출력이 아니라 의 출력 Processing host1이 이어집니다 . Processing host2host2host1
Kusalananda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.