如何在第三个位置接收两个或多个独立进程的输出而不影响这两个进程?
我有两个进程,A 和 B,每个进程都在自己的进程中运行screen
,不断输出内容。
我可以运行screen
并附加到 A 以查看其输出:
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
,然后输入)。
答案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