我正在编写以下 shell 脚本:
perf stat taskset -c 0 runspec & perf stat taskset -c 1 runspec
perf stat taskset -c 0 runspec & perf stat taskset -c 1 runspec
如图所示,每一行由提交给两个不同 cpu 的两个任务组成。我想要一种方法来保证第二行“后两个任务”在前两个任务成功完成之前不会开始执行。有办法吗?
您需要wait
为后台进程的PID。
perf stat taskset -c 0 runspec &
pid=$!
perf stat taskset -c 1 runspec
wait $pid
perf stat taskset -c 0 runspec &
pid=$!
perf stat taskset -c 1 runspec
wait $pid
显然,通过一些额外的重构会更优雅。或许是这样的:
parallel () {
local pid
# Danger: unquoted interpolation
$1 &
pid=$!
# Danger: unquoted interpolation
$2
wait $pid
}
prun () {
perf stat taskset -c $1 runspec
}
parallel "prun 0" "prun 1"
parallel "prun 0" "prun 1"
请注意,该parallel
函数插入$1
且$2
没有双引号。对于这个玩具演示,这是无害的,但如果您最终需要传入带引号的字符串作为参数,您将需要一个更精细的解决方案。
您是否尝试在没有“&”字符的情况下运行它?通常,与号告诉 bash 在后台运行命令并继续执行下一个命令。如果没有与号,任务应该等到完成才能继续进行下一个。
迈克尔·G。