Esecuzione di più funzioni bash in background e in attesa fino al loro ritorno


14

Questo è un semplice script che esegue il nvidia-smicomando su più host e salva il suo output in un file comune. L'obiettivo qui è farlo funzionare in modo asincrono .

È &alla fine della process_host()funzione di chiamata è sufficiente? La mia sceneggiatura è corretta?

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

Risposte:


13

Sì, ma l'output potrebbe essere confuso. È meglio che la funzione scriva il suo output in un file specifico a seconda del nome host e quindi consenta allo script principale di concatenare il risultato (e ripulire).

Inoltre, dovresti citare due volte le tue variabili. Copia e incolla lo script in ShellCheck .

Forse qualcosa del genere:

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

L'ultimo loop può essere sostituito da

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

Ottengo esattamente l'output che voglio ottenere, cosa potrebbe andare storto qui?
syntagma,

2
@ ΔλЛ Se, ad esempio, il primo host è lento a rispondere, Processing host1sarà seguito da Processing host2e l'uscita da host2piuttosto che l'uscita da host1.
Kusalananda
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.