Bash脚本的行为异常/奇怪

时间:2019-05-27 13:08:12

标签: bash shell raspberry-pi2

首先,我要为在编程,编写脚本等方面的绝对菜鸟道歉。 我正在运行FreeNAS服务器和Raspberry Pi,我想包含一个sh脚本,该脚本应检查8个客户端(IP地址)是否在线。如果是,它们应该停止,但是如果所有IP都处于脱机状态,则它应该执行另一个任务/脚本。

这是我的问题:在Internet上(src:https://www.tech-blogger.net/freenas-automatisch-bei-nicht-benutzung-abschalten/),我发现了一个脚本,该脚本可以检查特定IP,如果它们处于脱机状态,它将自动关闭。当我ping这些地址时,我会丢失100%的软件包,这表明它们已脱机。但是该脚本使我感到呼应,至少一个客户端处于脱机状态。因为我不是那个愚蠢的人,所以我认为它与我的代码有关。有人知道我的脚本出了什么问题吗?:

HOST1=192.168.1.32
HOST2=192.168.1.33
HOST3=192.168.1.34
HOST4=192.168.1.35
HOST5=192.168.1.36

_exit () {
case $1 in
1) echo „No Shutdown – At least one PC is online“ ;;
2) echo „No PC is online – Shutdown“ ; shutdown -p now ;;
esac
exit $1;
}

#Check if IPs are online
if [ `ping -c 1 -i 1 $HOST1 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST2 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST3 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST4 | grep -wc 100.0%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST5 | grep -wc 100.0%` -eq 0 ] ; then _exit 1;

#All Clients are offline, shutdown
else
_exit 2
fi
fi

2 个答案:

答案 0 :(得分:0)

我不确定100%能否正确解决您的问题。但是我认为您应该尝试替换||。在您的if语句中使用&&。

|| =或 && =和

因此,当所有客户端都关闭时,它将仅进入关机部分。

编辑:

ping -c 1 -i 1 192.168.1.36
PING 192.168.1.36 (192.168.1.36) 56(84) bytes of data.
From 62.155.241.85 icmp_seq=1 Destination Host Unreachable

--- 192.168.1.36 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

这是100%的数据包丢失,不是 100.0%。因此,您可以检查未发生的事情。

#!/bin/bash

HOST1=192.168.1.32
HOST2=192.168.1.33
HOST3=192.168.1.34
HOST4=192.168.1.35
HOST5=192.168.1.36

_exit () {
case $1 in
1) echo „No Shutdown – At least one PC is online“ ;;
2) echo „No PC is online – Shutdown“ ;; # shutdown -p now ;;
esac
exit $1;
}

#Check if IPs are online
if [ `ping -c 1 -i 1 $HOST1 | grep -wc 100%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST2 | grep -wc 100%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST3 | grep -wc 100%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST4 | grep -wc 100%` -eq 0 ] || [ `ping -c 1 -i 1 $HOST5 | grep -wc 100%` -eq 0 ] ; then _exit 1;

#All Clients are offline, shutdown
else                                                                                                                                                                                           
_exit 2
fi

这按预期工作(在我的机器上)。 :-)

答案 1 :(得分:0)

正如威廉·珀塞尔(William Pursell)在评论中说的那样,当ping未达到请求的IP时,它将返回一个非零的退出代码,指示失败。 Bash之类的shell中的if语句可以直接使用该退出代码,而不必使用带括号的条件表达式。

我建议使用循环而不是长时间的条件。如果主机数量发生变化,这将更易于阅读和维护,并且更易于扩展。

# create an array of IPs
host_ips=(
    192.168.1.32
    192.168.1.33
    192.168.1.34
    192.168.1.35
    192.168.1.36
)

for ip in "${host_ips[@]}"
do
    if ping -c 1 -i 1 "$ip"
    then
        _exit 1
        # no need to break since _exit doesn't return
    fi
done
# if we made it this far, none are online
_exit 2