बैकग्राउंड में कई बैश फंक्शन्स चलाना और उनके लौटने तक इंतजार करना


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
@ HostλЛ यदि, उदाहरण के लिए, पहला मेजबान प्रतिक्रिया करने के लिए धीमा है, Processing host1तो इसके बाद Processing host2के आउटपुट के host2बजाय आउटपुट से और उसके बाद होगा host1
Kusalananda
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.