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