1

私は次のシェルスクリプトを書いています:

perf stat taskset -c 0 runspec  & perf stat taskset -c 1 runspec 

perf stat taskset -c 0 runspec  & perf stat taskset -c 1 runspec 

ご覧のとおり、各行は2つの異なるCPUに送信された2つのタスクで構成されています。最初の2つのタスクが正常に完了するまで、2行目の「次の2つのタスク」の実行が開始されないことを保証する方法が必要です。それをするために離れていますか?

4

2 に答える 2

3

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

于 2012-08-14T04:23:19.563 に答える
0

'&'文字なしで実行してみましたか?通常、アンパサンドはbashにバックグラウンドでコマンドを実行し、次のコマンドに進むように指示します。アンパサンドがない場合、タスクは完了するまで待機して次のタスクに進む必要があります。

マイケルG。

于 2012-08-13T23:03:54.593 に答える