【发布时间】:2018-09-10 17:33:05
【问题描述】:
上下文
有一个愚蠢的脚本来检查一个进程是否在一组主机上运行,就像看门狗一样,正如我所说的那样,这是一个愚蠢的脚本,所以请记住它不是脚本标准的“完美”
问题
我已经运行bash -x 并且可以看到脚本完成了它的第一次检查而没有实际将命令的输出重定向到非常令人沮丧的文件,这意味着实际上每个主机都被评估为最后一个主机输出
代码
#!/bin/bash
FILE='OUTPUT'
for host in $(cat /etc/hosts | grep webserver.[2][1-2][0-2][0-9] | awk {' print $2 ' })
do ssh -n -f $host -i <sshkey> 'ps ax | grep myprocess | wc -l' > $FILE 2> /dev/null
cat $FILE
if grep '1' $FILE ; then
echo "Process is NOT running on $host"
cat $FILE
else
cat $FILE
echo "ALL OK on $host"
fi
cat $FILE
done
脚本回溯
++ cat /etc/hosts
++ awk '{ print $2 }'
++ grep 'webserver.[2][1-2][0-2][0-9]'
+ for host in '$(cat /etc/hosts | grep webserver.[2][1-2][0-2][0-9] | awk {'\'' print $2 '\''})'
+ ssh -n -f webserver.2100 -i <omitted> 'ps ax | grep myprocess | wc -l'
+ cat OUTPUT
+ grep 1 OUTPUT
+ cat OUTPUT
+ echo 'ALL OK on webserver.2100'
ALL OK on webserver.2100
+ cat OUTPUT
+ printf 'webserver.2100 checked \n'
webserver.2100 checked
+ for host in '$(cat /etc/hosts | grep webserver.[2][1-2][0-2][0-9] | awk {'\'' print $2 '\''})'
+ ssh -n -f webserver.2101 -i <omitted> 'ps ax | grep myprocess | wc -l'
+ cat OUTPUT
2
+ grep 1 OUTPUT
+ cat OUTPUT
2
+ echo 'ALL OK on webserver.2101'
ALL OK on webserver.2101
+ cat OUTPUT
2
+ printf 'webserver.2101 checked \n'
webserver.2101 checked
问题
如您所见,它没有为第一个主机注册任何内容,然后在完成后,它将数据通过管道传输到文件中,然后正在评估第二个主机以获取以前的主机数据...
我怀疑它与重定向有关,但在我看来这应该有效,但它不那么令人沮丧。
【问题讨论】:
-
我建议用
pgrep myprocess | wc -l替换ps ax | grep myprocess | wc -l。 -
我认为问题在于
weberserv.2100ssh 命令失败,因此只输出到stderr。您能否通过将错误输出重定向到/dev/null以外的其他内容来检查这一点? -
@jayant - 我已经验证两个主机都在线,它们都可以访问
-
@DannyWatson 不,您误解了正在发生的事情。到第一个主机的 ssh 将 nothing 返回到 stdout(可能是由于某种错误;您必须删除 stderr 重定向才能找出答案)。到第二台主机的 ssh 正在返回“2”(可能是因为它同时找到了您正在寻找的进程和
grep myprocess——这将在您使用的方法中间歇性发生,因此请改用pgrep)。
标签: bash if-statement grep