上下文
有一个愚蠢的脚本,检查进程是否正在一组主机上运行,比如看门狗,正如我所说的那样,这是一个愚蠢的脚本,所以请记住它并不完美&#39 ;通过脚本标准
问题
我已经运行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
问题
正如您所看到的,它没有为第一台主机注册任何内容,然后在完成后,它将数据传输到文件中,然后第二台主机正在评估以前的主机数据...
我怀疑它与重定向有关,但在我看来这应该有效,它并不令人沮丧。
答案 0 :(得分:2)
我认为您假设ps ax | grep myprocess
将始终返回至少一行(grep进程)。我不确定这是真的。我会像这样重写:
awk '/webserver.[2][1-2][0-2][0-9]/ {print $2}' /etc/hosts | while IFS= read -r host; do
output=$( ssh -n -f "$host" -i "$sshkey" 'ps ax | grep "[m]yprocess"' )
if [[ -z "$output" ]]; then
echo "Process is NOT running on $host"
else
echo "ALL OK on $host"
fi
done
这个技巧ps ax | grep "[m]yprocess"
有效地从ps输出中删除了grep进程: