如何在bash shell脚本中启动两个线程?

时间:2014-05-19 15:19:55

标签: linux multithreading bash shell scp

我正在尝试将文件从machineBmachineC复制到machineA,因为我正在machineA上运行我的下面的shell脚本。

如果文件不在machineB中,那么它应该在machineC中确保存在,所以我会首先尝试从machineB复制文件,如果machineB中没有{1}}然后我会尝试从machineC复制相同的文件。

我使用GNU Parallel库并行复制文件,它工作正常。目前我正在并行复制两个文件。

目前,我正在使用GNU parallel复制PRIMARY_PARTITION文件夹中的PRIMARY文件,一旦完成,我将SECONDARY_PARTITION文件复制到SECONDARY文件夹中GNU并行,因此它现在是顺序的PRIMARYSECONDARY文件夹

下面是我的shell脚本,一切正常 -

#!/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[@]}"

问题陈述: -

我有没有办法启动两个线程,一个是使用与上面相同的设置复制PRIMARY文件夹中的文件,这意味着它将并行复制两个文件。使用与上面相同的设置复制SECONDARY文件夹中的文件的第二个线程,它还应该同时并行复制两个文件?

意味着他们应该同时在PRIMARYSECONDARY文件夹中并行复制文件,而不是PRIMARY文件夹,然后复制SECONDARY文件夹中的文件。

目前,一旦PRIMARY文件夹文件完成,我只会尝试复制SECONDARY文件夹中的文件。

简而言之,我只需要启动两个线程,一个线程就会运行它 -

# 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[@]}"

一旦成功复制了所有文件,它应该回显消息,复制所有文件。在java中,我知道如何启动两个线程并且每个线程正在执行某个任务但不确定bash shell脚本中这将如何工作?

我的主要任务是同时使用PRIMARY文件夹和SECONDARY文件夹中的GNU parallel并行复制两个文件?

这可以在bash shell脚本中执行吗?

1 个答案:

答案 0 :(得分:1)

只需启动另一个bash脚本即可在终端中使用&运营商可能会在这里解决您的需求