循环浏览文件夹中的每个脚本作为并行作业,

时间:2019-10-28 06:01:55

标签: linux bash shell

我需要在parralel作业的文件夹中运行脚本。

这是我的文件夹结构:

.
├── quo1374
├── quo2147
├── quo1407
......
├── quo1342
│   ├── dist
│   │   └── v0.1.0-alpha
│   │       └── unix
│   │           └── mjolnir
│   ├── examples
│   │   ├── values-local-134217728-m4.2xlarge.yaml
│   │   
│   ├── remote_script.sh
│   └── run
│       ├── quo1342-134217728-m4.2xlarge
│       │   ├── quo1342-134217728-m4.2xlarge
│       │   └── quo1342-134217728-m4.2xlarge.sh
│       ├── quo1342-134217728-m4.xlarge
│       │   ├── quo1342-134217728-m4.xlarge
│       │   └── quo1342-134217728-m4.xlarge.sh
│       ├── quo1342-134217728-m5.12xlarge
│       │   ├── quo1342-134217728-m5.12xlarge
│       │   └── quo1342-134217728-m5.12xlarge.sh
│       ├── quo1342-134217728-m5.16xlarge
│       │   ├── quo1342-134217728-m5.16xlarge
│       │   └── quo1342-134217728-m5.16xlarge.sh
│       ├── quo1342-134217728-m5.24xlarge
│       │   ├── quo1342-134217728-m5.24xlarge
│       │   └── quo1342-134217728-m5.24xlarge.sh
│       ├── quo1342-134217728-m5.4xlarge
│       │   ├── quo1342-134217728-m5.4xlarge
│       │   └── quo1342-134217728-m5.4xlarge.sh
│       ├── quo1342-134217728-m5.8xlarge
│       │   ├── quo1342-134217728-m5.8xlarge
│       │   └── quo1342-134217728-m5.8xlarge.sh
│       ├── quo1342-134217728-m5.metal
│       │   ├── quo1342-134217728-m5.metal
│       │   └── quo1342-134217728-m5.metal.sh
│       ├── quo1342-134217728-t2.2xlarge
│       │   ├── quo1342-134217728-t2.2xlarge
│       │   └── quo1342-134217728-t2.2xlarge.sh
│       ├── quo1342-134217728-t3a.2xlarge
│       │   ├── quo1342-134217728-t3a.2xlarge
│       │   └── quo1342-134217728-t3a.2xlarge.sh
│       └── quo1342-134217728-t3a.xlarge
│           ├── quo1342-134217728-t3a.xlarge
│           └── quo1342-134217728-t3a.xlarge.sh

例如,脚本└── quo1342-134217728-m4.2xlarge.sh运行一项作业。这是我想运行的一部分工作。我正在尝试将run/quo134*/quo1342-134217728*.sh的内容作为ript并将其作为单独的作业运行,即,激活后,我将遍历文件夹中的每个脚本,但是整个作业将是由&持有。这背后的原因是我大约有12个单独的文件夹,看起来像这样。我很想并行运行它们。但是,重要的是文件夹中的脚本要按顺序运行。

这是我尝试做的尝试。尽管它不起作用,但我希望它能使我的问题更加清楚。

for f in *
do cd $f/run 
    for f in *.sh

      bash "$f" -H &
      cd ..
    done
done

对此我将不胜感激。

更新

dash-o的答案有所帮助,但又引发了另一个问题。 bash脚本使用相对路径,例如quo1342-134217728-t3a.xlarge.sh包含类似

的引用
../../dist/v0.1.0-alpha/unix/mjolnir 

当我使用您的脚本时,它会运行,但是执行似乎不遵守脚本中的文件路径,即

 ssh: Could not resolve hostname : Name or service not known + ../../dist/v0.1.0-alpha/unix/mjolnir destroy ../../examples/values-local-549755813888-t3a.xlarge.yaml 

有没有一种方法可以运行不破坏此脚本的脚本

1 个答案:

答案 0 :(得分:2)

您可以使用帮助功能来实现

Function run_folder {
   local  dir=$1 f=
   cd $dir/run
   # sequential execution
   for f in */*.sh ; do
       # Execute each test in it's folder.
       (cd ${f%/*} && bash ${f##*/} -H)
   done
}

# parallel execution 
For j in * ; do
   run_folder $j &
Done
wait