Reinicia o programa sendo executado em segundo plano e ainda o faz consumir de stdin

0

Esta é uma extensão da pergunta anterior que eu fiz aqui

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

Eu tenho usado com sucesso o script para servir ao meu propósito (pode não ser correto conforme os princípios de programação)

Estou executando o script da seguinte forma

./script.sh &

Pergunta

Existe alguma maneira de reiniciar apenas a parte do programa java acima?

Tentativas

  • Assim que o program foi interrompido, todo o script é desativado.
  • Tentei um programa simples em python lendo de stdin e imprimindo os dados. Executado em uma janela de tmux session. Tentei escrever para stdout de outra janela na sessão no mesmo prompt de comando do host, o que não funcionou (provando que eu preciso ler mais sobre stdin como tal). Isso foi para ver se a gravação dos dados no arquivo + stdout e a leitura de stdin podem ser separados, se houver.
por Confused 11.04.2017 / 19:05

1 resposta

2

Provavelmente não; reiniciar o consumidor de entrada padrão requer a capacidade desse consumidor de exec em si.

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

Quando executado, reinicia a si mesmo a cada quatro linhas:

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

Eu vou sair em um membro e acho que um soquete ou fila de mensagens pode servir melhor a necessidade de matar aleatoriamente e reiniciar o consumidor de saída, como então as mensagens (até um limite de buffer ou com bloqueio ...) permanecerão enquanto o processo do consumidor está sendo eliminado e reiniciado. Ou você pode escrever um proxy de algum tipo que leia entrada padrão e seja tolerante de que o consumidor java subseqüente não esteja disponível aleatoriamente, ou seja capaz de reiniciar mais ou menos normalmente o dito consumidor.

(Note que com as leituras em buffer, o consumidor pode precisar tomar mais cuidado para processar ou de alguma forma transmitir os dados incompletos que foram lidos pela leitura em buffer, mas não foram tratados no momento da reinicialização ou da saída ...)

    
por 11.04.2017 / 20:31

Tags