Arka planda birden fazla bash işlevi çalıştırmak ve dönene kadar beklemek


14

Bu, nvidia-smibirden fazla ana bilgisayarda komut çalıştıran ve çıktısını ortak bir dosyaya kaydeden basit bir komut dosyasıdır. Buradaki amaç, eşzamansız olarak çalışmasını sağlamaktır .

Is &sonunda process_host()fonksiyonu yeterli diyoruz? Senaryom doğru mu?

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

Yanıtlar:


13

Evet, ancak çıktınız bozuk olabilir. Ana bilgisayarın adına bağlı olarak işlevin çıktısını belirli bir dosyaya yazması ve ardından ana komut dosyasının sonucu birleştirmesine (ve temizlemesine) izin vermek daha iyidir.

Ayrıca, değişkenlerinizi iki kez alıntılamanız gerekir. Komut dosyasını kopyalayıp ShellCheck'e yapıştırın .

Belki böyle bir şey:

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

Son döngü ile değiştirilebilir

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

Tam olarak almak istediğim çıktıyı alıyorum, burada yanlış giden ne olabilir?
syntagma

2
@ ΔλЛ Örneğin, ilk ana makine yavaş yanıt veriyorsa, Processing host1onu takip eder Processing host2ve çıktıyı host2değil çıktı alır host1.
Kusalananda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.