เรียกใช้ฟังก์ชันทุบตีหลายอย่างในพื้นหลังและรอจนกระทั่งพวกเขากลับมา


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 host2และเอาท์พุทจากมากกว่าการส่งออกจากhost2 host1
Kusalananda
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.