4

関連トピックを調べましたが、答えが見つかりませんでした。

これが私の問題です:

通常、for ループではなく実行するこれらのコマンドを、2 つの別個の for ループに入れようとしています。

元のコマンド:

command1 &
command2 &

wait

command 3

これは明らかにバックグラウンドで2つのコマンドを開始し、両方が終了した後、コマンド3を開始します

ここに私のforループスクリプトがあります:

file1=directory1/*.txt

for i in $file1;

do

command1 ${i} > ${i}.test & # I know, it will generate files like ".txt.test". It's ok.

done &


file2=directory2/*.txt

for i2 in $file2;

do

command1 ${i2} > ${i2}.test & 

done &

wait

command3

コマンド 3 を実行しているときに、「待機」を入れても command1 または command2 からいくつかのジョブを見つけることができるため、スクリプトに問題があります。

&なしで2番目の「完了」のような別のオプションを試しました。私も2つの待機を試みました..しかし、私がすることはすべて...私はすべての仕事を台無しにします:(

私の間違いはどこですか(丁寧にお願いします:P)?

ありがとうございました

ファビオ

4

2 に答える 2

1

両方の "for" ループを保存しますが、"&" をすべて削除して、別々のファイル (loop1、loop2) として保存します。chmod a+rx loop1 loop2; そして実行します:

loop1 &
loop2 &
wait
command3

"done &" の動作がわかりません。使用しない方がよいでしょう。
あなたのコードはすべてを同時に実行しています。2 つのスレッドが必要であると想定しています。

編集:単一のスクリプトソリューション:

script1=`mktemp /tmp/.script.XXXXXX`;
cat >$script1 <<END
for i in directory1/*.txt; do
  command1 ${i} > ${i}.test;
done 
END

script2=`mktemp /tmp/.script.XXXXXX`;
cat >$script2 <<END
for i in directory2/*.txt; do
  command1 ${i} > ${i}.test;
done 
END

chmod u+rx $script1 $script2
$script1 &
$script2 &
wait;
command3

/bin/rm $script1 $script2
于 2013-03-01T17:02:41.453 に答える
0

各コマンドの後にアンパサンド (&) を付ける必要はありません。各コマンドの後に付けるだけで、両方のループからのすべてのジョブがバックグラウンドに置かれ、1 回待機するだけでうまくいきます。

for i in $( seq 1 3 ); do
    command1 "$i" > "$i.test" &
done

for i in $( seq 4 6 ); do
    command2 "$i" > "$i.test" &
done

wait

command3

$!別のアプローチは、次のように、を使用して各バックグラウンド プロセスの pid を格納することです。

pid=""
command & pid="$pid $!"
wait $pid
于 2013-06-12T11:16:59.403 に答える