Bash仅在脚本完成后重定向命令输出

时间:2018-04-01 06:22:48

标签: bash if-statement grep

上下文

有一个愚蠢的脚本,检查进程是否正在一组主机上运行,​​比如看门狗,正如我所说的那样,这是一个愚蠢的脚本,所以请记住它并不完美&#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 

问题

正如您所看到的,它没有为第一台主机注册任何内容,然后在完成后,它将数据传输到文件中,然后第二台主机正在评估以前的主机数据...

我怀疑它与重定向有关,但在我看来这应该有效,它并不令人沮丧。

1 个答案:

答案 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进程:

  • 字符串&#34; myprocess &#34;匹配正则表达式&#34; [m] y process &#34; (这是正在运行的&#34; myprocess&#34;进程),但是
  • 字符串&#34; [m] y process &#34;与正则表达式&#34; [m] y process &#34;不匹配(这是正在运行的&#34; grep&#34;流程)