Menjalankan beberapa fungsi bash di latar belakang dan menunggu hingga kembali


14

Ini adalah skrip sederhana yang menjalankan nvidia-smiperintah pada banyak host dan menyimpan hasilnya ke file umum. Tujuannya di sini adalah membuatnya berjalan secara tidak sinkron .

Apakah &pada akhir process_host()pemanggilan fungsi sudah cukup? Apakah skrip saya benar?

#!/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

Jawaban:


13

Ya, tetapi output Anda mungkin kacau. Lebih baik memiliki fungsi menulis outputnya ke file tertentu tergantung pada nama host dan kemudian biarkan skrip utama menyatukan hasilnya (dan bersihkan).

Selain itu, Anda harus menggandakan penawaran variabel Anda. Salin dan tempel skrip ke ShellCheck .

Mungkin kira-kira seperti ini:

#!/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"

Loop terakhir dapat diganti dengan

cat "${hosts[@]/%/.out}" >"$outfile"
rm -f "${hosts[@]/%/.out}"

Saya mendapatkan hasil persis yang ingin saya dapatkan, apa yang salah di sini?
syntagma

2
@ ΔλЛ Jika, sebagai contoh, tuan rumah pertama lambat merespons, Processing host1akan diikuti oleh Processing host2dan keluaran dari host2daripada keluaran dari host1.
Kusalananda
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.