我在太阳能发电系统各处都安装了数据记录器,还有一个在午夜运行的程序来收集当天的数据并将其存储在硬盘上。
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 ...
并且退出。ping
0
1
2
您可以轻松地将其与if
构造一起使用;您不需要计算响应,只需使用ping
asif
的条件来if
评估退出状态以ping
继续执行任何定义的分支:
if ping -c 1 SOLAR &>/dev/null; then
## Reachable -- do stuffs
else
## Unreachable -- do other stuffs
fi
我正在将ping
的 STDOUT 和 STDERR 流重定向到,/dev/null
因为我们对它们不感兴趣。