在尝试使用exit status
命令时,我的Perl脚本卡住了ping
。
根据this网站:
如果ping根本没有收到任何回复数据包,它将以代码1退出。如果指定了数据包计数和截止时间,并且在截止时间到达之前收到的数据包数量少于它,则它也将以代码1退出。在其他错误上,它以代码2退出。否则它以代码0退出。这使得可以使用退出代码来查看主机是否处于活动状态。
列出结果:
请注意,我链接到的页面显示“Linux / Unix ping命令”,但其他系统,甚至Linux和Unix的变体,可能会改变此值。
如果可能的话,我会在相关系统上进行测试,以确保您拥有正确的系统。
值得在您的操作系统上对此进行一些测试。例如在OSX上
可解决的主机是什么
ping -c 1 google.com ; echo $?
回复:
PING google.com (173.194.38.14): 56 data bytes
64 bytes from 173.194.38.14: icmp_seq=0 ttl=51 time=16.878 ms
--- google.com ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 16.878/16.878/16.878/0.000 ms
返回
0
关闭/不响应ping的可解析主机
ping -c 1 localhost ; echo $?
回复:
PING stuart-woodward.local (127.0.0.1): 56 data bytes
--- stuart-woodward.local ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
返回:
2
不可解析的主机
ping -c 1 sdhjfjsd ; echo $?
回复:
ping: cannot resolve sdhjfjsd: Unknown host
返回:
68
如果从指定的主机听到至少一个响应,ping实用程序将返回零退出状态;如果传输成功但没有收到回复,则为2;如果发生错误,则返回另一个值(from)。
http://www.manpagez.com/man/8/ping
实际返回值可能取决于您的系统。
从命令行尝试man ping
。返回值列在底部附近。
成功连接将始终返回代码0,而失败的连接将始终返回代码1及更高版本。
要对此进行测试,请尝试使用此代码段
#!/bin/bash
light_red='\e[1;91m%s\e[0m\n'
light_green='\e[1;92m%s\e[0m\n'
ping -c 4 -q google.comz
if [ "$?" -eq 0 ]; then
printf "$light_green" "[ CONNECTION AVAILABLE ]"
else
printf "$light_red" "[ HOST DISCONNECTED ]"
fi
您还应该考虑到,如果ping例如收到'网络无法访问'icmp回复,它将被计为回复,因此返回成功状态0(在Windows上使用cygwin ping测试)。因此,如果主机处于活动状态并且IMO是一个错误,那么测试真的没有用。