백그라운드에서 실행 중인 프로그램을 다시 시작하고 여전히 표준 입력에서 사용하도록 합니다.

백그라운드에서 실행 중인 프로그램을 다시 시작하고 여전히 표준 입력에서 사용하도록 합니다.

이전에 질문드린 내용의 연장입니다여기

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

런타임은 4줄마다 다시 시작됩니다.

$ 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 소비자의 무작위 사용 불가능을 허용하거나 해당 소비자를 어느 정도 정상적으로 다시 시작할 수 있는 일종의 에이전트를 작성할 수 있습니다.

(버퍼링된 읽기의 경우 소비자는 버퍼링된 읽기에서 읽었지만 다시 시작하거나 종료할 때 아직 처리되지 않은 불완전한 데이터를 처리하거나 어떻게든 전달하기 위해 추가 노력을 기울여야 할 수도 있습니다....)

관련 정보