socat - завершить на STDIN EOF при использовании опции fork

Я использую socat для публикации данных из стандартного ввода в порт. Вкратце:

some_process | socat -u - tcp-listen:8888,reuseaddr,fork

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

Простой тестовый пример:

while : ; do echo 1; sleep 1; done | socat -u - tcp-listen:8888,reuseaddr,fork

который дает это дерево процессов (через pstree):

bash─┬─bash───sleep
     └─socat

Если я убью второй bash (который запускает цикл while), я получаю:

bash───socat

Я хочу, чтобы socat также был прекращен. Возможно ли то, что я хочу?


person Dave Jennings    schedule 19.08.2016    source источник


Ответы (1)


Чтобы ответить на мой собственный вопрос, похоже, что то, что я хочу, невозможно.

Из документации (xio.help):

Вариант: вилка

Без fork (или fork=0) процесс прослушивания принимает ровно одно соединение и после этого завершается. С набором fork он создает новый дочерний процесс socat для каждого входящего соединения.

Родительский процесс остается в цикле вызовов accept() и fork() до тех пор, пока не будет завершен извне.

Я решил проблему, соединив два моих процесса с FIFO:

mkfifo /tmp/myfifo
socat -u - tcp-listen:8888,reuseaddr,fork < /tmp/myfifo &
socat_pid=$!
some_process > /tmp/myfifo
(some_process terminates for some reason)
kill $socat_pid
rm /tmp/myfifo
person Dave Jennings    schedule 19.08.2016