Перезапуск программы, работающей в фоновом режиме, и по-прежнему ее использовать из stdin

Это продолжение предыдущего вопроса, который я задал здесь

{ python2 readLines.py & python2 readLines.py & python2 readLines.py & python2 readLines.py & python2 readLines.py & } | tee output_file | java program 

Я успешно использовал сценарий для выполнения моих целей (это может быть неверно в соответствии с принципами программирования)

Я выполняю скрипт следующим образом

 ./script.sh & 

Вопрос

Есть ли способ перезапустить только часть программы Java, описанную выше?

попытки

  • Как только program была остановлена, весь скрипт спускается.
  • Пробовал простую программу в чтении python из stdin и распечатывал данные. Выполняется в одном окне сеанса tmux . Пробовал писать на stdout из другого окна в сеансе в той же командной строке хоста, которая не работала (доказывая, что мне нужно больше читать о stdin как таковой). Это должно было увидеть, если запись данных в файл + stdout и чтение из stdin можно разделить, если вообще.

Возможно нет; перезапуск стандартного входного потребителя требует способности этого потребителя выполнять сам.

 #include <err.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> int main(int argc, char *argv[]) { char buf[1]; int ret; int linenumber = 0; fprintf(stderr, "collect me some input...\n"); while (1) { ret = read(STDIN_FILENO, buf, 1); // unbuffered. inefficient if (ret == 0) // EOF exit(EXIT_SUCCESS); else if (ret < 0) err(1, "read failed"); write(STDOUT_FILENO, buf, 1); if (buf[0] == '\n') { linenumber++; if (linenumber == 4) { // restart ourself every four lines... execvp(*argv, argv); err(1, "exec failed"); } } } exit(EXIT_SUCCESS); } 

Который при запуске перезапускает себя каждые четыре строки:

 $ make execself cc execself.c -o execself $ perl -E 'say "line $_" for 1..8' | ./execself collect me some input... line 1 line 2 line 3 line 4 collect me some input... line 5 line 6 line 7 line 8 collect me some input... $ 

Я собираюсь выйти на конечность и догадаться, что очередь сокетов или сообщений может лучше подойти к необходимости случайного уничтожения и перезагрузки потребителя вывода, поскольку тогда сообщения будут (до предела буфера или с блокировкой. .), когда потребительский процесс уничтожается и перезапускается. Или вы можете написать прокси-сервер какого-то типа, который читает стандартный ввод и терпит к тому, что последующий пользователь java случайно недоступен или сможет более или менее изящно перезапустить упомянутого потребителя.

(Обратите внимание, что при буферизованных чтениях потребителю может потребоваться дополнительные усилия для обработки или каким-то образом передать все незавершенные данные, прочитанные буферизованным чтением, но не были обработаны во время перезапуска или выхода …)