Aim
我想通过网络 Build 双向串行连接,即在不同的主机上有两个字符设备,h1是Jenkins从站,h2是由TCP连接绑定的 . 这应该作为Jenkins工作的一部分运行 . 我选择的工具是 socat .

The problem
从Jenkins运行时 socat 行为错误 . 这个工作是一个'Freestyle' Jenkins项目,只有一个构建步骤 - 'Execute shell':

#!/bin/bash -e
socat -x -d -d -d tcp:h2:54321 pty,link=/tmp/vmodem1,echo=0,raw,wait-slave

这些步骤每次都会重现问题:

  • h2:运行TCP服务器

socat -x -d -d -d pty,link=/tmp/vmodem1,echo=0,raw tcp4-listen:54321,reuseaddr

  • h2:打开 /tmp/vmodem1 进行阅读:

cat /tmp/vmodem1 > dump

  • 开始詹金斯工作 .

  • h1:发送一些数据

dd if=/dev/zero of=/tmp/vmodem1 bs=1024 count=10

这些行动的结果as this gist . 如您所见,即使 dd 报告已发送字节,也没有发生 . 当我执行完全相同的命令,但是从终端而不是Jenkins在h1上运行 socat 时,我可以看到在 socat 输出中打印了零,并且 dump 文件具有预期的大小 .

这个设置可能看似人为,但我故意在Jenkins脚本中只留下一个 socat 命令作为一个最小的例子 .

两台主机上的 socat 版本: 1.7.2.3 - 默认为Ubuntu 14.04 .
詹金斯版本: 1.607

与常规交互式shell相比,Jenkins shell环境必须有所不同,但为什么它会破坏 socat ?此外,如果有人知道通过网络 Build 这种串行连接的任何其他方式,我将非常感谢任何建议 .