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
program
se detiene, todo el guión desaparece. - Probé un programa simple en Python leyendo
stdin
e imprimiendo los datos. Ejecutado en una ventana detmux
sesión. Intenté escribirstdout
desde 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 respectostdin
). Esto fue para ver si escribir los datos en el archivo +stdout
y leerlosstdin
se pueden separar, en todo caso.
Respuesta1
Probablemente no; reiniciar el consumidor de entrada estándar requiere la capacidad de ese consumidor para exec
sí 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...)