bash - 如何在 bash 脚本中自动打印来自多个后台进程的行?

标签 bash unix scripting

在我编写的 bash 函数中,我通过 ssh 启动多个远程命令,并让它们在单独的后台进程中运行。这些过程中的每一个都会产生许多行文本,这些文本被合并在一起,然后进行排序。我的问题是有时这些行会混合在一起。即一行开始打印,在该行打印完成之前,另一行在同一行开始打印。

我的问题是什么是使此打印输出成为原子的最简单方法,这样各个行就不会混合在一起(散布整行是可以的——我只希望列对齐)?我的一个想法是保存每个并行后台进程的输出,然后将它们串行合并,但我无法让它工作(如果我知道如何正确地执行此方法,这种方法对我来说应该很好用)。作为引用,这里是我尝试编写的脚本类型的概述:

foo() {
    (
        pids=()
        for x in "$@"
        do
            (
                ssh $x 'some-high-latency-command-with-200-lines-of-data-output'
            ) &
            pids+=( $! )
        done
        for x in "${pids[@]}"
        do
            wait $x
        done
    ) 2> /dev/null
}

最佳答案

我会将每个 ssh 运行重定向到它自己的文件,然后将它们合并。我也不会使用 wait 循环; wait 本身将等待所有后台进程,或者如果你真的只想要 ssh,你可以说 wait ${pids[*]}过程。

关于bash - 如何在 bash 脚本中自动打印来自多个后台进程的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6590434/

相关文章:

bash - Ansible async_status 任务 - 错误 : ansible_job_id "undefined variable"

linux - 如何使用 collectd 在 linux 中将系统指标从一台机器推送到另一台机器?

linux - 使用多个分隔符打印

linux - sh -c "command"的 Sigkill 子进程

linux - 是否有任何与 Unix 'magic' 命令兼容的文件类型的 `file` header 集合?

javascript - Rhino 将 Java 类传递给 Javascript 函数

bash - 使用 sudo 权限在 docker 容器中添加新用户

c - func 之前预期为 '=' 、 ',' 、 ';' 、 'asm' 或 '__attribute__'

powershell - 如何在Powershell中使用Java命令

php - 我可以启动一个脚本,使其独立于 Linux 上的父进程吗?