Shell 命令/脚本来查看主机是否处于活动状态?

Shell 命令/脚本来查看主机是否处于活动状态?

我正在尝试找出更多方法来查看给定主机是否已启动,仅使用 shell 命令(主要是bash)。理想情况下,它能够同时使用主机名和 IP 地址。目前我所知道的唯一本地方式是 ping,也许集成到脚本中如此处所述。还有其他想法吗?

答案1

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

答案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 文件共享。安装:

# 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

相关内容