当作为 upstart 作业运行时,nc 在连接时立即退出

当作为 upstart 作业运行时,nc 在连接时立即退出

我正在使用以下/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 版本。而是来自ncatnmap 软件。与 BSD 版本不同,没有标志。您可以使用-d代替。EL7 附带的 NCAT 版本有一个(已关闭/修复)-dl-l --recv-only < /dev/zero漏洞如果读取 stdin 返回 EOF,则在完成从套接字读取之前关闭程序。这就是为什么您需要通过“/dev/zero”或其他方式将数据传递到 stdin。较新版本的 NCAT 支持--no-shutdown可以代替< /dev/zero

相关内容