我正在研究一个bash脚本,该脚本使用pssh运行外部命令,然后将命令的输出与每个服务器的IP连接起来。 pssh具有-o选项,该选项将每个服务器的文件写入指定的目录,但是如果命令未运行,则只有一个空文件。我遇到的问题是使用“服务器无法访问”之类的内容更新这些空文件,以便我知道服务器存在连接问题,并且不会导致其余脚本出现问题。
这是我到目前为止所拥有的:
#!/bin/bash
file="/home/user/tools/test-host"
now=$(date +"%F")
folder="./cnxhwinfo-$now/"
empty="$(find ./cnxhwinfo-$now/ -maxdepth 1 -type f -name '*' -size 0 -printf '%f%2d')"
command="echo \$(uptime | awk -F'( |,|:)+' '{d=h=m=0; if (\$7==\"min\") m=\$6; else {if (\$7~/^day/) {d=\$6;h=\$8;m=\$9} else {h=\$6;m=\$7}}} {print d+0,\"days\",h+0,\"hours\",m+0,\"minutes\"}'), \$(hostname | awk '{print \$1}'), \$(sudo awk -F '=' 'FNR == 2 {print \$2}' /etc/connex-release/version.txt), \$(lscpu | awk -F: 'BEGIN{ORS=\", \";} NR==4 || NR==6 || NR==15 {print \$2}' | sed 's/ *//g') \$(free -k | awk '/Mem:/{print \$2}'), \$(df -Ph | awk '/var_lib/||/root/ {print \$2,\",\"\$5,\",\"}')"
pssh -h $file -l user -t 10 -i -o /home/user/tools/cnxhwinfo-$now -x -tt $command
echo "Server Unreachable" | tee "./cnxhwinfo-$now/$empty"
ls ./cnxhwinfo-$now >> ./cnx-data-$now
cat ./cnxhwinfo-$now/* >> ./cnx-list-$now
paste -d, ./cnx-data-$now ./cnx-list-$now >>./cnx-data-"$(date +"%F").csv"
我试图使用find来定位空文件,并使用tee将此“服务器”写为不可用:
echo "Server Unreachable" | tee "./cnxhwinfo-$now/$empty"
如果指定的文件夹不存在,则会出现此错误:
tee:./cnxhwinfo-2019-09-03/:是目录
如果它确实存在(即,我再次运行脚本),它会创建一个以find命令返回的IP地址命名的文件,如下所示:
192.168.1.2 192.168.1.3 192.168.1.4 1
我也尝试过:
echo "Server Unreachable" | tee <(./cnxhwinfo-$now/$empty)
find命令将IP地址输出在一行上,并且每行之间都有一个空格,因此我认为使用tee很好,但是我觉得我要么遇到语法问题,要么就这是错误的方式。我使用相同的脚本的另一个版本,该版本使用常规的ssh并运行良好,但比使用pssh慢得多。
答案 0 :(得分:1)
empty
应该是一个数组,假定文件名中都没有空格。
readarray -t empty < <(find ...)
echo "Server unreachable" | (cd ./cnxhwinfo-$now/; tee "${empty[@]}" > /dev/null)
否则,通过串联空文件名来构建单个文件名。