并行性 - 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
可能具有的任何输出缓冲。
我想 运行 我的脚本中有两个命令。第一个 运行 是一个测试,第二个查询此测试以获得测试 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
可能具有的任何输出缓冲。