Bash 使用时间戳检查端口可用性的脚本

Bash Script to Check Port Availability with Timestamp

在 Mac OS X 10.10 上使用 netcat,我想每分钟测试 Facilis TerraBlock 服务器上的监听端口,以确认以太网监听器是否正常工作。

我希望脚本输出一行表示成功,一行表示失败,并在前一行记录 date/timestamp。我目前不需要将任何这些记录到文件中。

像这些原生 nectat 输出的东西是理想的:

Wed Feb  4 10:49:09 EST 2015
Connection to 10.40.255.11 port 859 [tcp/*] succeeded!
nc: connectx to 10.40.255.12 port 859 (tcp) failed: Connection refused

这是我创建的脚本:

#!/bin/bash

date
nc -z 10.40.255.11 859 || nc -vz 10.40.255.11 859
nc -z 10.40.255.12 859 || nc -vz 10.40.255.12 859

while sleep 60; do date;nc -z 10.40.255.11 859 || nc -vz 10.40.255.11 859 & nc -z 10.40.255.12 859 || nc -vz 10.40.255.12 859; done

此脚本的行为异常,我推测是 ||运营商,但我找不到另一种方法来做好这件事。具体来说,当脚本运行时,终端输出在 .11 和 .12 测试之间交替出现在时间戳之后的第一个或第二个,这让我想知道它是否只是 netcat 响应的连接超时导致回复偶尔出现订单,或者如果有更大的问题并且我的脚本返回不可靠的数据。

这是我当前输出的示例:

Fri Feb  6 10:51:33 EST 2015
Connection to 10.40.255.11 port 859 [tcp/*] succeeded!
Connection to 10.40.255.12 port 859 [tcp/*] succeeded!
Fri Feb  6 10:51:34 EST 2015
Connection to 10.40.255.12 port 859 [tcp/*] succeeded!
Connection to 10.40.255.11 port 859 [tcp/*] succeeded!
Fri Feb  6 10:51:35 EST 2015
Connection to 10.40.255.12 port 859 [tcp/*] succeeded!
Connection to 10.40.255.11 port 859 [tcp/*] succeeded!
Fri Feb  6 10:51:36 EST 2015
Connection to 10.40.255.11 port 859 [tcp/*] succeeded!
Connection to 10.40.255.12 port 859 [tcp/*] succeeded!

我添加了||和 & 运算符,以及看似冗余的代码,因为我只想在连接失败时查看 netcat 的详细输出。

您的脚本可能更可靠,如下所示:

#! /bin/bash

ips="10.40.255.11 10.40.255.11 10.40.255.12 10.40.255.12"

while  true ; do
  # This will make sure it will run every 60 seconds, not 60 seconds + whatever nc takes to execute
  sleep 60 & 
  date
  for ip in $ips; do
    # Note that we're using -w to timeout 
    out=$(nc -zvw 2 $ip 859 2>&1) && echo "$out" && break
  done || echo "$out"
  # This waits for sleep in background 
  wait
done