Answers:
ping
是测试主机是否存在并已连接的方法。(如果主机还活着,但已断开连接或响应速度很慢,则无法将其与已死的主机区分开。)
该ping
命令支持的选项因系统而异。您将要确保它不会永远循环,但是如果没有收到答复,则会在几秒钟后返回。
使用FreeBSD和Linux iputils,ping -c 1 -W 1 >/dev/null
发送一次ping并等待1秒钟。您不需要解析输出:如果命令收到ping命令,则该命令返回0,否则返回非零(主机名未知,没有通往主机的路由,没有回复)。一些实现可能需要不同的标志(例如,-w
而不是-W
在FreeBSD上),请查看系统上的手册。
if ping -c 1 -W 1 "$hostname_or_ip_address"; then
echo "$hostname_or_ip_address is alive"
else
echo "$hostname_or_ip_address is pining for the fjords"
fi
answered
答案。more ways to see if a given host is up
除了使用之外ping
,OP专门要求该答案未提供。
"Because of the load it can impose on the network, it is unwise to use ping during normal operations or from automated scripts."
Ping可以很好地获得有关主机是否已连接到网络的快速响应,但是它通常不会告诉您主机是否处于活动状态,或者它是否仍按预期运行。这是因为ping响应通常是由内核处理的,因此,即使系统上的每个应用程序都崩溃了(例如,由于磁盘故障或内存不足),您仍然经常会收到ping响应,并且可能会认为机器是当情况完全相反时,则可以正常运行。
通常,您实际上并不在乎主机是否仍然在线,而您真正关心的是计算机是否仍在执行某些任务。因此,如果您可以直接检查任务,那么您将知道主机已启动并且任务仍在运行。
例如,对于运行Web服务器的远程主机,您可以执行以下操作:
# Add the -f option to curl if server errors like HTTP 404 should fail too
if curl -I "http://$TARGET"; then
echo "$TARGET alive and web site is up"
else
echo "$TARGET offline or web server problem"
fi
如果它运行SSH,并且您设置了用于无密码登录的密钥,那么您还有更多选择,例如:
if ssh "$TARGET" true; then
echo "$TARGET alive and accessible via SSH"
else
echo "$TARGET offline or not accepting SSH logins"
fi
这是通过SSH进入主机并运行true
命令,然后关闭连接来实现的。ssh
如果该命令可以成功运行,则该命令将仅返回成功。
您可以将其扩展为检查特定进程,例如确保该进程mysqld
正在计算机上运行:
if ssh "$TARGET" bash -c 'ps aux | grep -q mysqld'; then
echo "$TARGET alive and running MySQL"
else
echo "$TARGET offline or MySQL crashed"
fi
当然,在这种情况下,最好monit
在目标计算机上运行类似的命令以确保服务保持运行,但是在脚本中非常有用,在脚本中,您只想在计算机A上执行一些任务,只要计算机B准备就绪即可。 。
这可能类似于在执行目标计算机之前检查目标计算机是否已安装某个文件系统rsync
,这样,如果由于某种原因未安装辅助文件系统,您就不会意外填充其主磁盘。例如,这将确保/mnt/raid
继续安装在目标计算机上。
if ssh "$TARGET" bash -c 'mount | grep -q /mnt/raid'; then
echo "$TARGET alive and filesystem ready to receive data"
else
echo "$TARGET offline or filesystem not mounted"
fi
有时,没有简单的方法可以连接到服务,而您只想查看它是否接受传入的TCP连接,但是当您telnet
到达相关端口上的目标时,它只是坐在那里并且不会断开您的连接,这意味着您可以这样做。在脚本中将导致其挂起。
尽管不太干净,您仍然可以在timeout
和netcat
程序的帮助下执行此操作。例如,这将检查计算机是否在TCP端口445上接受SMB / CIFS连接,因此即使您没有密码登录或CIFS客户端工具都没有,也可以查看计算机是否正在运行Windows文件共享。 t安装:
# Wait 1 second to connect (-w 1) and if the total time (DNS lookups + connect
# time) reaches 5 seconds, assume the connection was successful and the remote
# host is waiting for us to send data. Connecting on TCP port 445.
if echo 'x' | timeout --preserve-status 5 nc -w 1 "$TARGET" 445; then
echo "$TARGET alive and CIFS service available"
else
echo "$TARGET offline or CIFS unavailable"
fi