我正在尝试从通过网络连接到的设备上获取诊断数据。它提供了一个很好的严格产权协议,您可以在其中发送3个或4个字符的请求,并收到<〜30个字符的响应。要考虑的事情:
我正在尝试使用netcat进行此操作。基本操作很简单:
$ echo STA | netcat <IP> <Port>
123498754
STA请求将为您提供一个状态字,netcat将该状态字写入stdout。我也可以做到
$ cat | netcat <IP> <Port>
STA # <- typed input
12345678 # written by netcat
STA # <- typed input
12345678 # written by netcat
在这里,我可以看到第一个请求花费的时间要长得多:几秒钟,而没有明显的延迟。我想摆脱延迟。所以我的任务开始了:保持网猫打开!
我不能仅将文件传输到netcat,因为我必须等待响应。因此,我正在尝试使用FIFO进行此操作。我创建了两个(/ d / pc2dev和/ d / dev2pc),都具有rw权限。如果可以使基础工作,我可以根据该脚本编写脚本。可行
#### SHELL 1 #############################
$ tail -f /d/pc2dev | netcat <IP> <Port> | tr '\r' '\n'
12345678654 # written by netcat with delay
12345678654 # written by netcat as soon as I send the request on shell 2
12345678654 # ditto
#### SHELL 2 #############################
$ echo STA > /d/pc2dev
$ echo STA > /d/pc2dev
$ echo STA > /d/pc2dev
(没有tr,响应将被彼此覆盖。) 但是,这不是:
#### SHELL 1 #############################
$ tail -f /d/pc2dev | netcat <IP> <Port> | tr '\r' '\n' > /d/dev2pc
#### SHELL 2 #############################
$ echo STA > /d/pc2dev
$ echo STA > /d/pc2dev
#### SHELL 3 #############################
$ cat /d/dev2pc
# expecting output here - none comes!
写入普通文件也不起作用:
#### SHELL 1 #############################
$ tail -f /d/pc2dev | netcat <IP> <Port> | tr '\r' '\n' > log.txt
#### SHELL 2 #############################
$ echo STA > /d/pc2dev
$ echo STA > /d/pc2dev
$ cat log.txt
# nothing
似乎对FIFO /文件的写操作被缓冲在某个地方,而对stdout的写操作则立即完成。 (但是,即使在ctrl + c'ing netcat等人身上,也不会写入此假设的缓冲输出。)
是那样还是那样-我怎样才能使它正常工作?
答案 0 :(得分:1)
尝试通过管道传递到tee
而不是重定向输出man 1 tee
,看看会发生什么。
以下方法有效
$ tail -f /d/pc2dev | stdbuf -i0 -o0 netcat <IP> <Port> | stdbuf -i0 -o0 tr '\r' '\n' > /d/dev2pc