将多个stdout / stderr合并到一个标准输出中

时间:2013-06-21 02:32:58

标签: process merge terminal subprocess stdout

我有一个运行多个进程的开发堆栈:Web服务器,自动测试,后台编译等。所有这些都是基本的命令行命令,例如node app.jslein midje :autotest

是否可以使用一个脚本在“后台”中运行所有这些进程,并且将其输出合并为一个标准(即:在终端屏幕上显示它)?

我发现(使用&)简易bash解决方案的一个问题是,在Ctrl + C上,后台进程显然保持活着,这是不可取的。

我尝试添加陷阱'kill $(jobs -pr)' SIGINT SIGTERM EXIT,但这似乎在OS X上无法可靠地工作 - 令人惊讶的是节点进程被杀死了,但java脚本退出后仍然存在(通过Ctrl + C)

我可以使用任何脚本语言。我更喜欢纯粹的bash或JS,但Python或Ruby也可以。

我还希望在合并输出中保留ANSI转义着色。

1 个答案:

答案 0 :(得分:2)

您可以使用multitail实用程序。它不仅允许您拖尾日志文件,还允许输出任意CLI程序(lein runlein midje :autotest,......)。

示例:

$ multitail --mergeall -cT ANSI -l "lein midje :autotest" -cT ANSI -l "lein ring server-headless"

Ctrl-C比杀死正在被尾随的所有进程。

如果您是OSX用户,可以使用multitail安装brew install multitail(假设您已经安装了自制程序 - 如果没有,请参阅http://mxcl.github.io/homebrew/

为了获得有关多指配置的更多信息,您可以阅读man multitailhttp://www.vanheusden.com/multitail/index.php

还有一些用法示例