1

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

我的 crontab:

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

我的 bash 脚本(RUP_ssh):

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

谢谢,

尼夫帕舍嫩

4

2 回答 2

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
于 2012-11-08T11:04:13.387 回答
0

假设有一个字符串来标识内存/加载数据来自哪个主机,您可以在每个结果进来时更新您的 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 的帮助。

于 2013-02-01T14:03:53.753 回答