Ubuntu 16.04 如何在 Bash 脚本中使用 ping 来决定是否跳过代码块

Ubuntu 16.04 如何在 Bash 脚本中使用 ping 来决定是否跳过代码块

我在太阳能发电系统各处都安装了数据记录器,还有一个在午夜运行的程序来收集当天的数据并将其存储在硬盘上。

Ubuntu 服务器上的 bash 脚本遍历 7 个已收集数据的 Raspbian 单元,并将其放在硬盘上的正确位置,即由这些单元命名的目录中。我弄清楚了如何获取通用名称 today.dat 和 today.png,并将它们与当天的日期一起保存在存档中,例如 2017-08-10.png 和 2017-08-10.dat

--> 偶尔,某个单元由于某些问题或其他问题而没有响应,从而阻止程序的执行。

因此,在决定是否尝试从中收集数据之前,我想使用 ping 来测试系统是否响应。

我的系统名称都在 /etc/hosts 文件中,因此我通过名称引用它们。

为了回答这个问题,我正在检查 SOLAR - 监控充电控制器和逆变器行为的那个。

以下是我尝试过的:

if $( ping -c 1 SOLAR | grep icmp* | wc -l ) eq 0
then
   (do stuff like ssh -e "gnuplot makepng" then scp the png and raw data)
fi

(太复杂)

if [ $(ping -c 1 SOLAR >/dev/null) eq 0 ]
    then do the stuff
fi

(看起来不错,但我不明白为什么需要方括号)

一定会有更好的办法。

我希望做更多类似的事情

if $(ping -c 1 SOLAR) eq 0
then
   (do stuff)
else
   (then maybe echo "SOLAR didn't respond" | ssmtp [email protected]
fi

我已经有几十年没有编写过 bash 程序了 - 大部分时间都使用 C shell。而且我在网上收到了很多关于如何最好地编写 bash 程序的建议。

那么有人可以建议一种简单的方法来做到这一点吗?

答案1

似乎您只对退出状态感兴趣,ping即您是否从主机获取了对您的 ECHO_REQUEST 的 ICMP ECHO_RESPONSE;如果主机正在发送响应,如果没有响应并且主机未知,那么您就可以执行该操作ping -c 1 ...并且退出。ping012

您可以轻松地将其与if构造一起使用;您不需要计算响应,只需使用pingasif的条件来if评估退出状态以ping继续执行任何定义的分支:

if ping -c 1 SOLAR &>/dev/null; then
    ## Reachable -- do stuffs
else
    ## Unreachable -- do other stuffs
fi

我正在将ping的 STDOUT 和 STDERR 流重定向到,/dev/null因为我们对它们不感兴趣。

相关内容