백그라운드에서 실행 중인 프로그램을 다시 시작하고 여전히 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 소비자를 허용하거나 해당 소비자를 어느 정도 정상적으로 다시 시작할 수 있는 일종의 프록시를 작성할 수 있습니다.

(버퍼링된 읽기를 사용하면 소비자는 버퍼링된 읽기에서 읽었지만 다시 시작하거나 종료할 때 처리되지 않은 불완전한 데이터를 처리하거나 어떻게든 전달하기 위해 추가 고통을 감수해야 할 수 있습니다...)

관련 정보