【问题标题】:Merge multiple stdout/stderr into one stdout将多个 stdout/stderr 合并为一个 stdout
【发布时间】:2013-06-18 02:10:09
【问题描述】:

我有一个运行多个进程的开发堆栈: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 转义颜色。

【问题讨论】:

  • Java 进程能否捕捉到信号?如果您在其中一个在前台时按 Ctrl-C 会发生什么?

标签: process merge terminal subprocess stdout


【解决方案1】:

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

例子:

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

Ctrl-C 会杀死所有被跟踪的进程。

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

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

【讨论】:

    猜你喜欢
    • 2011-08-20
    • 2023-04-06
    • 1970-01-01
    • 2011-12-28
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2013-02-15
    相关资源
    最近更新 更多