nc немедленно завершает работу при подключении, когда запускается как задание upstart

Я использую следующее /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.

Я делаю предположение, что это как-то связано с stdin, Я пытался использовать -q -1 вариант, но это не помогло.

PS Я в порядке с тем, что это будет слушать только один клиент за один раз.

2 ответа

Я вижу две вещи не так с вашим nc команда. Вы вызываете nc способом, предназначенным для двусторонней связи, и ожидайте, что он будет выполнять одностороннюю связь.

-d флаг может остановиться nc от чтения из stdin который заставит его делать одностороннее общение, которое кажется, что вы пытаетесь сделать.

Другая проблема заключается в том, что nc -l по умолчанию будет обслуживать только одно соединение, а затем будет разорвано. Вы можете использовать -k флаг, чтобы изменить это поведение.

В целом команда таким образом становится:

nc -dkl 3333

Однако кажется, что вы используете инструмент, не предназначенный для этой работы. Вместо того, чтобы использовать nc Я бы порекомендовал вам использовать протокол системного журнала и регистратор, предназначенный для работы с этим протоколом.

nc -dl это то, что вам нужно для вкуса BSD nc,

nc то, что идет с RHEL7, не является версией BSD. Вместо этого это ncat из программного обеспечения Nmap. В отличие от версии BSD, нет -d флаг. Вместо -dl, ты можешь использовать -l --recv-only < /dev/zero, Версия NCAT, которая поставляется с EL7, имеет (закрытую / исправленную) ошибку, которая закрывает программу перед завершением чтения из сокета, если EOF возвращается из чтения stdin. Вот почему вам нужно передавать данные в стандартный ввод через '/dev/zero' или что-то еще. Более новые версии поддержки NCAT --no-shutdown который может быть использован вместо < /dev/zero,

Другие вопросы по тегам