이전에 질문드린 내용의 연장입니다여기
{
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 소비자의 무작위 사용 불가능을 허용하거나 해당 소비자를 어느 정도 정상적으로 다시 시작할 수 있는 일종의 에이전트를 작성할 수 있습니다.
(버퍼링된 읽기의 경우 소비자는 버퍼링된 읽기에서 읽었지만 다시 시작하거나 종료할 때 아직 처리되지 않은 불완전한 데이터를 처리하거나 어떻게든 전달하기 위해 추가 노력을 기울여야 할 수도 있습니다....)