Reiniciar el programa que se ejecuta en segundo plano y aún hacerlo consumir desde la entrada estándar

Reiniciar el programa que se ejecuta en segundo plano y aún hacerlo consumir desde la entrada estándar

Esta es una extensión de la pregunta anterior que había hecho.aquí

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

He estado usando exitosamente el script para cumplir mi propósito (puede que no sea correcto según los principios de programación)

Estoy ejecutando el script de la siguiente manera.

./script.sh &

Pregunta

¿Hay alguna forma de reiniciar solo la parte del programa Java de la configuración anterior?

Intentos

  • Tan pronto como programse detiene, todo el guión desaparece.
  • Probé un programa simple en Python leyendo stdine imprimiendo los datos. Ejecutado en una ventana de tmuxsesión. Intenté escribir stdoutdesde otra ventana de la sesión en el mismo símbolo del sistema del host, lo que no funcionó (lo que demuestra que necesito leer más al respecto stdin). Esto fue para ver si escribir los datos en el archivo + stdouty leerlos stdinse pueden separar, en todo caso.

Respuesta1

Probablemente no; reiniciar el consumidor de entrada estándar requiere la capacidad de ese consumidor para execsí mismo.

#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);
}

Que cuando se ejecuta se reinicia cada cuatro líneas:

$ 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...
$ 

Voy a arriesgarme y adivinar que un enchufe ocola de mensajespodría adaptarse mejor a la necesidad de eliminar y reiniciar aleatoriamente el consumidor de salida, ya que entonces los mensajes (hasta un límite de búfer o con bloqueo...) permanecerían mientras el proceso del consumidor se elimina y se reinicia. O podría escribir un proxy de algún tipo que lea la entrada estándar y sea tolerante con que el siguiente consumidor de Java no esté disponible aleatoriamente, o que pueda reiniciar más o menos elegantemente a dicho consumidor.

(Tenga en cuenta que con las lecturas almacenadas en el búfer, es posible que el consumidor deba esforzarse más para procesar o de alguna manera transmitir los datos incompletos leídos por la lectura almacenada pero que no se hayan tratado en el momento del reinicio o la salida...)

información relacionada