我正在使用下面的/etc/init/jsonlog.conf
upstart作业:
description "jsonlog" start on runlevel [23] stop on runlevel [06] respawn script cd /tmp echo "about to listen" /bin/nc -l 3333 echo "finished listening" end script post-stop script sleep 1 end script
问题是nc
每次客户端连接都立即退出。
所需的行为是收到的所有数据(即utf8 json)都应该以/var/log/upstart/jsonlog.log
结尾。 该服务器运行Ubuntu 12.04LTS。
当从bash shell运行时, nc
命令可以正常工作。
我在做一个假设 ,这是与stdin
。 我试过使用-q -1
选项,但没有帮助。
PS我很好,事实上,这将只听一个客户在一个时间。
我发现你的nc
命令有两个错误。 你正在调用nc
以双向通信的方式,期望它执行单向通信。
-d
标志可以停止从stdin
读取nc
,这将使它进行单向通信,看来你正在尝试做。
另一个问题是, nc -l
默认只会服务一个连接,然后终止。 您可以使用-k
标志来更改该行为。
所有的命令就这样变成:
nc -dkl 3333
不过看起来你正在使用一种不是为这项工作devise的工具。 我不build议使用nc
而是build议您使用syslog协议和devise用于使用该协议的logging器。
nc -dl
是你需要的nc
的BSD风格。
RHEL7附带的nc
不是BSD版本。 相反,它是nmap软件的ncat
。 与BSD版本不同,没有-d
标志。 而不是-dl
,你可以使用-l --recv-only < /dev/zero
。 EL7附带的NCAT版本有一个(封闭的/固定的) 错误 ,如果EOF从读取stdin返回,那么在从套接字读取之前将closures程序。 这就是为什么你需要通过“/ dev / zero”或其他方式将数据传递到stdin。 新版本的NCAT支持--no-shutdown
,可以用来代替< /dev/zero
。