我编写了一个脚本,通过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
答案 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的帮助。