我正在使用以下/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:我同意这个事实:每次只能监听一个客户端。
答案1
我发现你的命令有两个问题nc
。你以一种旨在进行双向通信的方式调用nc
,却希望它执行单向通信。
该-d
标志可以停止nc
读取,stdin
这将使其执行您正在尝试进行的单向通信。
另一个问题是nc -l
默认情况下只服务一个连接然后终止。您可以使用标志-k
来更改该行为。
总之命令变成:
nc -dkl 3333
但是,您使用的工具似乎不是为这项工作而设计的。nc
我建议您使用 syslog 协议和专为该协议设计的记录器,而不是使用。
答案2
nc -dl
正是您所需要的 BSD 风格nc
。
RHEL7附带nc
的 不是 BSD 版本。而是来自ncat
nmap 软件。与 BSD 版本不同,没有标志。您可以使用-d
代替。EL7 附带的 NCAT 版本有一个(已关闭/修复)-dl
-l --recv-only < /dev/zero
漏洞如果读取 stdin 返回 EOF,则在完成从套接字读取之前关闭程序。这就是为什么您需要通过“/dev/zero”或其他方式将数据传递到 stdin。较新版本的 NCAT 支持--no-shutdown
可以代替< /dev/zero
。