2014-05-19 44 views
1

我试图将文件从machineBmachineC复制到machineA,因为我在machineA上运行我的下面的shell脚本。如何在bash shell脚本中启动两个线程?

如果文件不存在在machineB那么它应该有在machineC肯定的,所以我会尝试从machineB先复制文件,如果它不存在于machineB然后我会尝试从machineC复制相同的文件。

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

目前,我使用的GNU平行复制PRIMARY_PARTITION文件PRIMARY文件夹,一旦做到这一点,那么我使用GNU平行一样的,所以它是连续的,截至目前WRT PRIMARYSECONDARY文件夹

SECONDARY_PARTITION文件复制 SECONDARY文件夹

下面是我的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 [email protected]$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMARY/. || scp [email protected]$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 [email protected]$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $SECONDARY/. || scp [email protected]$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 [email protected]$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $PRIMARY/. || scp [email protected]$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 [email protected]$FILERS_LOCATION_1:$dir3/new_weekly_2014_"$el"_200003_5.data $SECONDARY/. || scp [email protected]$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脚本中工作?

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

这是可能在bash shell脚本中做的吗?

+0

根据您的硬盘驱动器上的终端运行,你可能不希望在同一驱动器同时复制到两个不同的位置。这意味着你必须复制一点到一个点,然后找到另一个点写入它,然后再找到你的第一个点。 除非你必须同时写两个字,否则我会一个接一个地写。 阅读更多[here](http://superuser.com/questions/252959/which-is-faster-copying-everything-at-once-or-one-thing-at-a-time) –

回答

1

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

+0

@fopis:你能否提供一个例子,如果可能的话,这将如何解决我的例子? – john