2015-01-16 70 views
1

我有一个工具可以将数据流出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下工作)。

另一种方法是使用由wcncat计数行/字符输出,因为它仅输出一条线和退出时,如果连接无法进行。但是我不能永远等待流如果终止,所以我需要使用类似timeout这样的东西,它在尝试访问命令的输出时有其自身的复杂性。

是否有一种“简单”的方法,最小的依赖关系?

或者我应该写一个简单的工具吗?如果与主机/端口建立连接,它将返回读取的字节数,否则返回一个负的errno,并支持等待时间和协议规范(tcp/udp)。返回值为0意味着已建立连接,但在等待时间过期之前没有数据到达(知道一件好事)。

或者也许补丁ncat做到以上?

+0

可以将'ncat'输出重定向到'head -n 3',而不是'timeout',这会导致3行(指示活动流)后出现管道错误。不幸的是,'ncat'对'SIGPIPE'的响应很差,并且它是一个PITA来处理'bash'中的信号错误。 – BobC

回答

0

我使用netcat in FreeBSD,它有一个-z选项,只是检查一个端口是否打开。这消除了您在脚本中使用的背景和睡眠。

-z Specifies that nc should just scan for listening daemons, without 
     sending any data to them. 

该选项存在于旧版Ubuntu机箱的netcat上,因此这可能是您的一个选择。

$ nc -z somehost 1234 && echo "It's alive, ALIVE!" 

我在ncat中看不到相应的选项。您可能可以将netcat编译成busybox;它比ncat小得多,至少在我的系统:

的Linux:

$ ls -lH `which nc ncat` 
-rwxr-xr-x 1 root root 31296 2010-02-21 01:32 /bin/nc 
-rwxr-xr-x 1 root root 130448 2009-11-06 04:39 /usr/bin/ncat 

FreeBSD的:

ls -l `which nc ncat` 
-r-xr-xr-x 1 root wheel 28112 Jan 15 14:53 /usr/bin/nc 
-rwxr-xr-x 1 root wheel 182775 Mar 19 2012 /usr/local/bin/ncat 

当然,这并不能帮助你检查了交通量通过流,或分析其内容。为此,我认为您的解决方案具有创新性和合理性,但您提出的挑战可能无法轻松解决。

您可以使用ps来避免procfs依赖性,并且您可以将某些内容存储在临时文件中进行分析。请注意,busybox应包含一个mktemp,但您应该检查选项。我没有测试过这个:

#!/bin/sh 

TMPFILE=`mktemp /tmp/str.XXXX` 
trap "rm -f $TMPFILE" 0 1 2 3 15 

nc somehost 1234 > $TMPFILE & 
pid=$! 
sleep 1 

if ps $pid >/dev/null; then 
    kill -KILL $pid 
    echo -n "It's alive, " 
    if [ -s $TMPFILE ]; then 
    echo "ALIVE!" 
    else 
    echo "but unresponsive." 
    fi 
else 
    echo "He's dead, Jim." 
fi 

这就是我所拥有的。这与你已有的东西没有多大区别。

另一种选择可能是构建一个自定义工具,您可能可以编译到自己的busybox中,但这将是问题而不是问题。 :-)

+0

没有想过要回望好醇'netcat。谢谢! – BobC

+0

我已经拥有了大部分工具所需的C代码,所以我可能会这样做。 – BobC

+0

使用“nc -w 1 -z somehost 1234”可以加快速度,只要数据每秒钟至少有一次。 – BobC