并行性 - Shell 脚本

Parallelism - Shell scripting

我想 运行 我的脚本中有两个命令。第一个 运行 是一个测试,第二个查询此测试以获得测试 ID。

现在,问题是第二个命令仅在第一个命令 运行ning 时有效(当然,在它启动之后)。所以我不能按顺序 运行 它。 据我所知,我需要某种并行性,它应该允许 2 个进程并行 运行。这将允许第二个命令从第一个命令获取 ID,因为它仍然是 运行ning.

要点是:我没有也无法在这台机器上安装 Parallel。我也看到了 xargs,但似乎不适合这项任务。 有什么想法吗?

命令看起来像这样:

run test | list test running

谢谢

编辑 这就是报告的样子。它有很多不同的参数,但第一个是我需要的。

ID             | 94503
Name           | Test 
...

要获取我使用的 ID:

sed -n '1p' | sed 's/^.\{,17\}//' > test_id.dat

哪个把身份证号还给我

管道无法正常工作。关键是在 run test 之后,问题实际上是当我开始测试时,“shell 仍然忙于”测试执行。另一方面,第二个命令只能在测试 运行ning 时检索此 ID。示例:如果我从两个单独的会话(一个本地会话,一个 ssh)开始测试,我可以获得预期的结果。

编辑 2 一些额外的细节。为了获得“测试 ID”,我必须 运行 一个列出所有当前 运行ning 测试 (list test running) 的命令。 我按照建议写了这样的东西:

#!/bin/bash
list test running > test_running.dat | {
    run test
    cat test_running.dat | sed -n '1p' | sed 's/^.\{,17\}//' > test_id.dat
    cat test_id.dat
}

这里的问题(无论我先输入哪个命令)是我得到的结果是文件“No test 运行ning”。这意味着 list test running 会提前或延迟执行,但在任何情况下都不会 run test 是 运行ning.

更新

据我了解,run test 的输出无关紧要,因为您将使用 list test running 命令获得 ID。

我会说您可以等待 list test running 给您 ID。在这里,我使用基于 " 报告外观的 bash 正则表达式 ",因此您可能需要对其进行调整。

#!/bin/bash

run test &

# bash regex for capturing the test ID from the output of 'list test running'
# REMARK: it is based on "how the report looks like" in your question
regex='^ID *\| *([0-9]+)'

while ! [[ $(list test running) =~ $regex ]] && jobs -rp | awk 'END{exit(NR==0)}'
do
    sleep 1
done

test_id=${BASH_REMATCH[1]}

[[ $test_id ]] && echo "I got the test-ID: $test_id"

wait

旧答案

那么run test首先输出一行ID,然后继续计算并输出它可能是什么?
目前尚不清楚您将如何使用该 ID,但以下代码应该向您展示一种获取所需内容的方法,并在 run test 继续执行时 运行 使用它的命令:

#!/bin/bash

run test | {
    IFS= read -r line          # catch the first line (containing the ID)

    obtain test "${line:17}" & # launch the other command as a sub-process

    printf '%s\n' "$line"      # print the first line that was read
    cat                        # continue reading & printing the output
}

备注:您还需要禁用 run test 可能具有的任何输出缓冲。