Shell命令/脚本,看主机是否还活着?


9

我试图找出更多方法来查看给定主机是否正常运行,仅使用shell命令(主要是bash)即可。理想情况下,它将能够同时使用主机名和IP地址。现在,我知道的唯一本地方法是ping,也许可以将其集成到此处描述的脚本中。还有其他想法吗?

Answers:


7

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

我知道这是的方式,我只是希望它不是唯一的方式,即使其它方面很奇怪或变化无常或你有什么。那好吧!
user67459 2015年

2
该答案不应被标记为answered答案。more ways to see if a given host is up除了使用之外ping,OP专门要求该答案未提供。
Yokai

从“ ping”手册页:"Because of the load it can impose on the network, it is unwise to use ping during normal operations or from automated scripts."
1111161171159459134 '18 -10-26

@ 1111161171159459134该段的措词可能更好。太危言耸听了。您不应该对ping或ping进行高速率的ping操作,但有时一个ping数据包可以忽略不计。
吉尔斯(Gilles)'所以

2

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如果该命令可以成功运行,则该命令将仅返回成功。

通过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到达相关端口上的目标时,它只是坐在那里并且不会断开您的连接,这意味着您可以这样做。在脚本中将导致其挂起。

尽管不太干净,您仍然可以在timeoutnetcat程序的帮助下执行此操作。例如,这将检查计算机是否在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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.