Использование netcat / cat в фоновом скрипте (как избежать остановки (tty input)?) - PullRequest
8 голосов
/ 12 августа 2011

Аннотация: Как запустить интерактивное задание в фоновом режиме?

Подробно: я пытаюсь запустить этот простой сценарий в Ash Shell (Busybox) в качестве фонового задания.

myscript.sh &

Однако скрипт немедленно останавливается ...

[1] + Остановлен (ввод tty) myscript.sh

Содержимое myscript.sh ... (только соответствующая часть, за исключением того, что я перехватываю SIGINT, SIGHUP и т. Д.)

#!/bin/sh

catpid=0

START_COPY()
{
  cat /dev/charfile > /path/outfile &
  catpid = $! 
}

STOP_COPY()
{
  kill catpid 
}

netcat SOME_IP PORT | while read EVENT
do
  case $EVENT in
    start) START_COPY;;
    stop) STOP_COPY;;
  esac
done

Из простых тестов командной строки я обнаружил, что бот cat и netcat пытаются читать из tty,Обратите внимание, что в этой версии netcat нет -e для подавления tty.

Теперь, что можно сделать, чтобы избежать остановки myscript?

Вещи, которые я пытался сделать так без какого-либо успеха:

1) netcat / cat ... </ dev / tty (или вывод <code>tty)

2) Запуск блока, содержащего cat и netcat, в подоболочке с помощью ().Это может сработать, но как тогда получить PID кошки?

Перед вами эксперты ...


Проблема все еще существует.Простой тест для всех вас:

1) В одном терминале запустите netcat -l -p 11111 (без &)

2) В другом терминале запустите netcat localhost 11111 & (Это должно сделатьчерез некоторое время остановить с сообщением Остановлено (ввод TTY)

1037 * Как этого избежать?

Ответы [ 5 ]

11 голосов
/ 19 июля 2012

вы, вероятно, хотите netcat's "-d" option, что говорит о том, что не следует читать из STDIN.

6 голосов
/ 19 июня 2013

Я могу подтвердить, что -d поможет netcat работать в фоновом режиме.

Я видел ту же проблему с:

nc -ulk 60001 | nc -lk 60002 &

Каждый раз, когда я запрашивал jobs,вход канала прекратится.

Изменение команды на следующее исправило это:

nc -ulkd 60001 | nc -lk 60002 &
4 голосов
/ 12 августа 2011

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

  1. Пробелы вокруг = в catpid=$! делают строку недопустимым назначением переменной. Если это было в вашем оригинальном сценарии, я удивлен, что вы не получили никаких ошибок.

  2. Строка kill catpid должна завершиться сбоем, поскольку буквенное слово catpid не является допустимым идентификатором задания. Вы, вероятно, хотите kill "$catpid".

Что касается вашего актуального вопроса:

  • cat следует читать с /dev/charfile, а не с STDIN или где-либо еще. Вы уверены, что он пытался прочитать ввод tty?

  • Вы пытались перенаправить ввод netcat как netcat < /dev/null, если вам не нужно netcat, чтобы что-то прочитать?

1 голос
/ 19 ноября 2013

Мне нужно использовать netcat, у которого нет опции -d.

"echo -n | netcat ... &", кажется, эффективный обходной путь: т.е. закройте стандартный ввод для netcatнемедленно, если вам не нужно его использовать.

0 голосов
/ 24 февраля 2016

Поскольку пока не получено ответа, если опция Busybox и -d недоступна, следующая команда будет поддерживать netcat "живым" при отправке в фоновый режим:

tail -f /dev/null | netcat ...

netcat < /dev/null и echo -n | netcat у меня не сработало.

...