Я могу выполнить эти две команды:
nc -l localhost 8888 -v >> output.txt &
(while true;do sleep 1;echo a;done)|nc localhost 8888 &
Все работает как и ожидалось с output.txt
заполнением "a"s (хвостом с другого терминала). Но если ввести один символ в терминал, выполняющий фоновые задания, отправка nc
превращается из Running
в Stopped
:
$ jobs
[1]+ Stopped nc -l localhost 8888 -v >> output.txt
[2]- Running ( while true; do
sleep 1; echo a;
done ) | nc localhost 8888 &
Также обратите внимание, что он теряет свой "фоновый" амперсанд. Не знаю, с чего начать отладку этого. Это ожидаемое поведение? Спасибо.
Mac OSX 10.9, GNU Bash 3.2.52
решение1
netcat двунаправленный. Он копируетотсокет на стандартный вывод, иксокет из stdin. Когда вы нажимаете клавишу, он замечает, что данные доступны на stdin (tty) и пытается их прочитать. Фоновым заданиям не разрешено читать из tty, поэтому он приостанавливается.
Если вы не собираетесь отправлять какие-либо данные через сокет, вам следует добавить </dev/null
в команду netcat.
И это нормально, когда jobs
команда добавляет или удаляет амперсанд, когда меняется состояние задания.