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

Перезапуск программы, работающей в фоновом режиме, и сохранение возможности использования данных из 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если вообще можно.

решение1

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

#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 может быть случайно недоступен, или иметь возможность более или менее изящно перезапустить указанного потребителя.

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

Связанный контент