stdout一次性而不是逐行

时间:2012-11-08 10:56:34

标签: linux bash

我编写了一个脚本,通过ssh到每个服务器来获取服务器列表的加载和mem信息。但是,由于大约有20台服务器,因此等待脚本结束效率不高。这就是为什么我认为创建一个将脚本输出写入文件的crontab可能会很有趣,所以我需要做的就是每当我需要知道20个服务器的加载和mem信息时就抓住这个文件。但是,当我在执行crontab期间捕获此文件时,它会给我不完整的信息。那是因为我的脚本的输出是逐行写入文件而不是在终止时一次写入。我想知道要做些什么需要做些什么......

我的crontab:

* * * * * (date;~/bin/RUP_ssh) &> ~/bin/RUP.out

我的bash脚本(RUP_ssh):

for comp in `cat ~/bin/servers`; do
    ssh $comp ~/bin/ca
done

谢谢,

niefpaarschoenen

2 个答案:

答案 0 :(得分:2)

您可以将输出缓冲到临时文件,然后像这样一次输出所有内容:

outputbuffer=`mktemp` # Create a new temporary file, usually in /tmp/
trap "rm '$outputbuffer'" EXIT # Remove the temporary file if we exit early.
for comp in `cat ~/bin/servers`; do
    ssh $comp ~/bin/ca >> "$outputbuffer" # gather info to buffer file
done
cat "$outputbuffer" # print buffer to stdout
# rm "$outputbuffer" # delete temporary file, not necessary when using trap

答案 1 :(得分:0)

假设有一个字符串来识别mem / load数据来自哪个主机,你可以在每个结果进入时更新你的txt文件。假设数据块是一行你可以使用

for comp in `cat ~/bin/servers`; do
    output=$( ssh $comp ~/bin/ca )
    # remove old mem/load data for $comp from RUP.out
    sed -i '/'"$comp"'/d' RUP.out # this assumes that the string "$comp" is
                                  # integrated into the output from ca, and
                                  # not elsewhere
    echo "$output" >> RUP.out
done

这可以根据ca的输出进行调整。网上有很多关于sed的帮助。