【发布时间】:2015-01-17 05:01:47
【问题描述】:
我有一个将数据从 tcp 端口流出的仪器,我想在脚本中使用标准工具来确定流是否可用。
我手动使用ncat,如果数据流不可用,它会立即退出。
这是我最初的 bash 脚本:
#!/bin/bash
ncat somehost 1234 >/dev/null &
pid=$!
sleep 1
if [ -d /proc/$pid/ ]; then
kill -KILL $pid
echo "It's alive, ALIVE\!"
# Launch clients
else
echo "He's dead, Jim."
# Perform resurrection
fi
它有效,但我想知道是否有更简单或更好的方法来完成此任务,它不依赖于作业控制或 procfs 甚至 ncat。我还想知道在超时到期之前发送了多少数据。
而且,是的,在 bash 中 ncat host port 可以替换为 cat </dev/tcp/host/port,但我也想避免 bash-isms(这样它可以在busybox下工作)。
另一种方法是使用wc 来计算ncat 输出的行数/字符数,因为它只输出一行并在无法建立连接时退出。但是,如果流启动,我不能永远等待终止,所以我需要使用类似 timeout 的东西,这在尝试访问命令的输出时有其自身的复杂性。
是否有一种“简单”的方法可以使用最少的依赖项?
或者我应该写一个简单的工具来代替?如果与主机/端口建立连接,它将返回读取的字节数,否则返回负 errno,并支持等待时间和协议规范 (tcp/udp)。返回值 0 表示已建立连接,但在等待时间到期之前没有数据到达(这是一件好事)。
或者也许修补 ncat 来完成上述操作?
【问题讨论】:
-
可以将
ncat输出重定向到head -n 3,而不是timeout,这将在3 行之后导致管道错误(指示活动流)。可惜ncat对SIGPIPE的反应很差,处理bash的信号错误是个PITA。
标签: linux bash busybox network-traffic