【发布时间】:2019-09-03 20:24:35
【问题描述】:
我正在编写一个使用 pssh 运行外部命令的 bash 脚本,然后将命令的输出与每个服务器的 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 慢得多。
【问题讨论】: