পটভূমিতে একাধিক বাশ ফাংশন চালানো এবং তারা ফিরে না আসা পর্যন্ত অপেক্ষা করে


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

হ্যাঁ, তবে আপনার আউটপুট গার্ফড হতে পারে। হোস্টের নামের উপর নির্ভর করে একটি নির্দিষ্ট ফাইলে ফাংশনটি তার আউটপুট লিখতে বলা ভাল এবং তারপরে মূল স্ক্রিপ্টটি ফলাফলটিকে সম্মতি জানাতে দেয় (এবং পরিষ্কার করা)।

এছাড়াও, আপনার আপনার ভেরিয়েবলগুলি দ্বিগুণ করা উচিত। স্ক্রিপ্টটি শেলচেকে অনুলিপি করুন এবং আটকান ।

এরকম কিছু হতে পারে:

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

আমি যে আউটপুট পেতে চাই ঠিক তা পাই, এখানে কী ভুল হতে পারে?
সিন্ট্যাগমা

2
@ ΔλЛ যদি, উদাহরণস্বরূপ, প্রথম হোস্ট সাড়া ধীর হয়, Processing host1দ্বারা অনুসরণ করা হবে Processing host2এবং থেকে আউটপুট host2বরং থেকে আউটপুট চেয়ে host1
কুসালানন্দ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.