首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果文件不在远程服务器上或磁盘已满,则从子shell退出shell脚本?

如果文件不在远程服务器上或磁盘已满,则从子shell退出shell脚本?
EN

Stack Overflow用户
提问于 2018-04-21 02:36:04
回答 1查看 93关注 0票数 0

我使用下面的脚本从远程服务器并行复制文件:

代码语言:javascript
复制
#!/bin/bash

primary=/bat/primary
secondary=/bat/secondary

do_copy() {
  el=$1
  primsec=$2
  (scp -C -o StrictHostKeyChecking=no \
   goldy@"$remote":"$pod1"/abc_187_"$el"_111_8.data "$primsec"/. > /dev/null 2>&1)\
  || \
  (scp -C -o StrictHostKeyChecking=no \
   goldy@"$remote":"$pod2"/abc_187_"$el"_111_8.data "$primsec"/. > /dev/null 2>&1)\
  || \
  (scp -C -o StrictHostKeyChecking=no \
   goldy@"$remote":"$pod3"/abc_187_"$el"_111_8.data "$primsec"/. > /dev/null 2>&1)\
  || \
  (scp -C -o StrictHostKeyChecking=no \
   goldy@"$remote":"$pod4"/abc_187_"$el"_111_8.data "$primsec"/. > /dev/null 2>&1)
}
export -f do_copy

parallel -j "$5" do_copy {} $primary ::: ${pri[@]} &
parallel -j "$5" do_copy {} $secondary ::: ${snd[@]} &
wait
echo "all files copied"

在远程服务器上,我有四个文件夹,由$pod1$pod2$pod3$pod4表示。如果$pod1中没有文件,那么它应该在$pod2中,或者在$pod3中,或者在$pod4文件夹中。

现在我想做的是:

  • 如果这四个文件夹中的任何一个都没有文件,那么我希望立即退出具有非零状态代码的shell脚本。
  • 如果出于任何原因,让我们假设磁盘已经满了,并且文件没有被完全复制,那么我也希望使用非零状态代码退出。每个文件大小约为15 3GB,有时由于磁盘已满,我只看到从15 3GB中复制出3GB,我的shell脚本没有报告任何问题并成功传递。

我尝试在最后一个exit命令旁边添加scp命令,但它只是从子whole退出,而不是从整个脚本中退出。有办法做这些事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-26 06:53:12

我假设文件只存在于一个荚上,所以尝试所有的荚都不是问题。

代码语言:javascript
复制
#!/bin/bash

primary=/bat/primary
secondary=/bat/secondary

# Activate parset and env_parallel if not already done
. `which env_parallel.bash`

# Make array with $primary as many times as elements in $pri
parset prim -N0 echo $primary ::: ${pri[@]} 
# Make array with $secondary as many times as elements in $pri
parset seco -N0 echo $secondary ::: ${sec[@]}
export remote

do_copy() {
  el=$1
  primsec=$2
  pod=$3
  scp -C -o StrictHostKeyChecking=no \
   goldy@"$remote":"$pod"/abc_187_"$el"_111_8.data "$primsec"/
}
export -f do_copy
copy_one_file() {
  parallel do_copy $1 $2 ::: pod{1..4}
  if [ $? == 4 ] ; then
    return 1
  else
    return 0
  fi
}
export -f copy_one_file
parallel --halt now,fail=1 copy_one_file :::  ${pri[@]} ${sec[@]} :::+ ${prim[@]} ${seco[@]}

parset使用$primary制作一个与$pri一样长的数组。

:::+$pri中的元素链接到$prim中的元素。

对于parset,需要并行版本> 20170422。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49951854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档