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
,