Bashシェルスクリプトで2つのスレッドを起動するには?

Bashシェルスクリプトで2つのスレッドを起動するには?

machineB作業中でファイルをコピーしようとしています。machineCmachineAmachineA

ファイルがない場合はmachineB明らかに存在する必要があるので、machineCまずファイルをコピーしてみてください。そうでない場合は同じファイルをコピーしてみましょう。machineBmachineBmachineC

私はGNUパラレルライブラリを使ってファイルをパラレルにコピーしていますが、うまくいきます。現在、2つのファイルを並列にコピーしています。

現在、私はGNUを使用してフォルダ内のファイルを並列にコピーしています。完了したら、同じGNUを使用してフォルダ内のファイルを並列にコピーしPRIMARY_PARTITIONます。これまでは連続的でフォルダPRIMARYSECONDARY_PARTITIONSECONDARYPRIMARYSECONDARY

以下は私のシェルスクリプトです。すべてがうまくいきます。

#!/bin/bash

export PRIMARY=/test01/primary
export SECONDARY=/test02/secondary
readonly FILERS_LOCATION=(machineB machineC)
export FILERS_LOCATION_1=${FILERS_LOCATION[0]}
export FILERS_LOCATION_2=${FILERS_LOCATION[1]}
PRIMARY_PARTITION=(550 274 2 546 278) # this will have more file numbers
SECONDARY_PARTITION=(1643 1103 1372 1096 1369) # this will have more file numbers

export dir3=/testing/snapshot/20140103

# delete primary files first and then copy
find "$PRIMARY" -mindepth 1 -delete

do_CopyInPrimary() {
  el=$1
  scp david@$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMARY/. || scp david@$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMARY/.
}
export -f do_CopyInPrimary
parallel -j 2 do_CopyInPrimary ::: "${PRIMARY_PARTITION[@]}"

# delete secondary files first and then copy
find "$SECONDARY" -mindepth 1 -delete

do_CopyInSecondary() {
  el=$1
  scp david@$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $SECONDARY/. || scp david@$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $SECONDARY/.
}
export -f do_CopyInSecondary
parallel -j 2 do_CopyInSecondary ::: "${SECONDARY_PARTITION[@]}"

問題の説明:-

2つのスレッドを起動する方法はありますか? 1つのスレッドはPRIMARY上記と同じ設定を使用してフォルダ内のファイルをコピーします。つまり、両方のファイルを並列にコピーするという意味です。 2番目のスレッドは、SECONDARY上記と同じ設定を使用してフォルダ内のファイルをコピーします。両方のファイルも同時に並列にコピーする必要がありますか?

これは、フォルダが完了した後にフォルダ内のファイルをコピーするのではなく、フォルダPRIMARY内のファイルを同時に並列にコピーする必要があることを意味します。SECONDARYPRIMARYSECONDARY

現時点では、PRIMARYフォルダファイルが完成したら、私だけがSECONDARYフォルダ内のファイルをコピーしようとしています。

つまり、2つのスレッドを起動するだけです。 1つのスレッドがこれを実行します。

# delete primary files first and then copy
find "$PRIMARY" -mindepth 1 -delete

do_CopyInPrimary() {
  el=$1
  scp david@$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMARY/. || scp david@$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMARY/.
}
export -f do_CopyInPrimary
parallel -j 2 do_CopyInPrimary ::: "${PRIMARY_PARTITION[@]}"

2番目のスレッドはこれを実行します -

# delete secondary files first and then copy
find "$SECONDARY" -mindepth 1 -delete

do_CopyInSecondary() {
  el=$1
  scp david@$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $SECONDARY/. || scp david@$FILERS_LOCATION_2:$dir3/new_weekly_2014_"$el"_200003_5.data $SECONDARY/.
}
export -f do_CopyInSecondary
parallel -j 2 do_CopyInSecondary ::: "${SECONDARY_PARTITION[@]}"

すべてのファイルが正常にコピーされると、すべてのファイルがコピーされましたというメッセージが表示されます。 Javaでは2つのスレッドを起動し、各スレッドが特定のタスクを実行する方法を知っていますが、これがbashシェルスクリプトでどのように機能するのかわかりませんか?

PRIMARY私の主な作業は、SECONDARYGNUパラレルを使用して2つのファイルをフォルダの内外に同時にコピーすることです。

bashシェルスクリプトでこれを実行できますか?

ベストアンサー1

Bashはスレッドをサポートしていませんが、バックグラウンドマルチプロセッシングをサポートしています。つまり、プロセスは独自の環境、作業ディレクトリなどの新しいプロセススペースに複製され、すべての通信は通常のIPCチャネルを介して行われる必要があります。しかし、それ以外はスレッドと非常に似ているようです。

コードブロックを「コンテキスト化」することでこれを行うことができます。このように:

#!/bin/bash
{
    echo "Foo"
    sleep 1
    echo "Foo: done"
}&    
echo "Bar"
sleep 1
echo "Bar: done"

出力

Bar
Foo
**[1 second delay]**
Bar: done
Foo: done

関数にコードブロックをラップし、その関数をバックグラウンドジョブとして実行すると、同じ効果が得られます。

あるいは、中括弧の代わりに括弧でコードブロックを囲むこともできます。中括弧で囲まれたステートメントは、明示的に(常に)別々のプロセスで実行されます。通常、中括弧で囲まれたステートメントはグループ化されますが、実行時には分岐しません。サフィックスを使用してバックグラウンドでコードを実行すると、&コードは別のプロセスで実行されます。

おすすめ記事