我正在使用以下/etc/init/jsonlog.conf
新贵工作:
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。
nc
从 bash shell 运行时,该命令可以正常工作。
我假设这与stdin
. 我试过使用一个-q -1
选项,但它没有帮助。
PS 我很好,这一次只会听一个客户。
nc
我看到你的命令有两件事出了问题。您正在nc
以一种用于双向通信的方式调用,并期望它执行单向通信。-d
标志可以停止nc
读取,这stdin
将使它执行看起来您正在尝试执行的单向通信。另一个问题是
nc -l
默认情况下只服务一个连接然后终止。您可以使用该-k
标志来更改该行为。在所有命令中,因此变为:
但是,您似乎正在使用不是为这项工作设计的工具。
nc
我建议您使用 syslog 协议和设计用于该协议的记录器,而不是使用。nc -dl
是您需要的 BSD 风格的nc
.RHEL7
nc
自带的不是BSD版本。相反,它ncat
来自 nmap 软件。与 BSD 版本不同,没有-d
标志。而不是-dl
,您可以使用-l --recv-only < /dev/zero
. EL7 附带的 NCAT 版本有一个(已关闭/已修复)错误,如果从读取标准输入返回 EOF,则会在完成从套接字读取之前关闭程序。这就是为什么您需要通过“/dev/zero”或其他方式将数据传递到标准输入的原因。较新版本的 NCAT 支持--no-shutdown
可用于代替< /dev/zero
.