在后台运行多个bash函数并等待它们返回


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

Answers:


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}"

我得到的正是我想要得到的输出,这里可能出什么毛病?
宪法

2
@ΔλЛ例如,如果第一台主机响应速度慢,Processing host1将紧随其后,Processing host2然后是输出,host2而不是输出host1
库沙兰丹
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.