여러 독립 프로세스의 출력을 다른 터미널에 결합

여러 독립 프로세스의 출력을 다른 터미널에 결합

두 프로세스에 영향을 주지 않고 세 번째 위치에서 두 개 이상의 독립 프로세스의 출력을 받으려면 어떻게 해야 합니까?

A와 B라는 두 개의 프로세스가 있는데, 각각은 자체 프로세스에서 실행되고 screen지속적으로 콘텐츠를 출력합니다.

A를 실행 screen하고 추가하여 출력을 볼 수 있습니다.

12:00 Foo.
12:02 Foo.
12:04 Foo.

B와 동일:

12:01 Bar.
12:03 Bar.
12:05 Bar.

여러 화면을 결합하여 나란히 또는 유사하게 볼 수 있습니다.

하지만 저는 메시지의 "스트림"으로 결합된 이 두 프로세스의 출력을 볼 수 있는 방법을 찾고 있습니다.

12:00 Foo.
12:01 Bar.
12:02 Foo.
12:03 Bar.
12:04 Foo.
12:05 Bar.

CTRL + C실수로 유사한 콘텐츠를 프로세스 중 하나로 보내는 방법도 없습니다 . (저는 여전히 프로세스에 다시 연결하고 때때로 프로세스와 상호 작용할 수 있기를 원합니다. 이것이 바로 제가 사용하고 있는 것입니다 screen.)

그래서 두 프로세스를 동시에 실행하고 출력을 직접 보고 싶지는 않다고 생각합니다.

strace이를 사용하여 다음과 같은 작업을 수행 할 수 있습니다 .

strace -PIDofA -e write &
strace -PIDofB -e write &

그러나 출력은 그다지 예쁘지 않습니다.

write(1, "12:00 Foo.", 10) = 10
write(5, "Foo in file.", 12) = 12
write(1, "12:01 Bar.", 10) = 10
write(5, "Bar in file.", 12) = 12
...

strace그리고 결합된 출력을 얻기 위해 이런 방식으로 여러 개를 실행하는 것은 좋은 솔루션처럼 느껴지지 않습니다.

어쩌면 두 프로세스 모두 파일에 쓰고 다음을 수행하도록 할 수 있습니다.

tail -f output.txt

그러나 파일이 점점 더 많은 출력 라인으로 채워지기 때문에 이것이 문제를 일으킬지 확실하지 않습니다.

두 프로세스가 동시에 동일한 파일에 쓰려고 하면 어떻게 되는지 잘 모르겠습니다.

그렇다면 어떤 도구를 사용해야 하며, A와 B의 출력을 함께 표시하도록 프로세스를 어떻게 재설계할 수 있습니까?

(저는 Debian에서 실행하고 있으며 차이가 있다면 ssh를 통해 액세스하고 있습니다.)

답변1

가장 쉬운 방법은 화면에 내장된 로깅 기능을 사용하는 것 같습니다. 화면 명령 키 [control-A], H 출력 화면은 screenlog.«window»(예: screenlog.0)에 기록됩니다. 두 화면이 동일한 디렉터리에 있고 동일한 창 번호를 갖는 경우 결국 동일한 로그 파일에 기록되며 이는 원하는 대로 작동하는 것으로 보입니다. 서로 다른 디렉터리/다른 창 번호에 있는 경우 예를 들어 를 사용하여 두 파일을 병합할 수 있습니다 tail -qf dir1/screenlog.0 dir2/screenlog.0.

화면이 출력을 약간 버퍼링하므로 믹스가 완벽하지 않을 수 있습니다. 그 중 하나에서 몇 줄을 얻은 다음 다른 것에서 몇 줄을 가져오는 식으로 계속됩니다.

logfile및 옵션을 사용하여 파일 이름과 버퍼 시간을 설정할 수 있습니다 logfile flush. 플러시 시간을 0으로 설정하면 작동하는 것 같습니다(화면 명령 키, :를 누른 다음 를 입력 logfile flush 0하고 Enter를 누르세요).

답변2

각 명령의 출력을 tee file파일로 파이프하고 tail -f를 사용하여 작업할 수 있습니다. 프로세스 간에 동기화가 없으므로 출력이 인터리브됩니다(아마도 보기 흉한 방식으로). 디스크가 가득 차는 것이 걱정된다면 대신 명명된 파이프로 출력할 수 있습니다.

[first screen]
$ mkfifo /tmp/foo
$ tail -f /tmp/foo

[second screen]
$ command1 | tee /tmp/foo

[third screen]
$ command2 | tee /tmp/foo

관련 정보