Назад | Перейти на главную страницу

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.

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

P.S. Меня устраивает тот факт, что это будет слушать только одного клиента за раз.

Я вижу две проблемы с твоим 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.