이전에 제가 질문했던 질문의 연장선입니다.여기
{
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 소비자를 허용하거나 해당 소비자를 어느 정도 정상적으로 다시 시작할 수 있는 일종의 프록시를 작성할 수 있습니다.
(버퍼링된 읽기를 사용하면 소비자는 버퍼링된 읽기에서 읽었지만 다시 시작하거나 종료할 때 처리되지 않은 불완전한 데이터를 처리하거나 어떻게든 전달하기 위해 추가 고통을 감수해야 할 수 있습니다...)