【问题标题】:Bash script for looping through a program for several different input files用于在程序中循环几个不同输入文件的 Bash 脚本
【发布时间】:2011-03-05 16:12:29
【问题描述】:

我想要一个 bash 脚本在后台运行一个程序(获取多个变量和一个输入文件),但我希望该脚本一次只处理一个输入文件(一个目录中的所有输入文件)。例如

#!/bin/sh  
for file in *  
do  
    ~/FrameDP/bin/FrameDP.pl --cfg ~/FrameDP/cfg/FrameDP.cfg --no_train --infile /home/bop08olp/FrameDP/data/"$file" --outdir ~/FrameDP/test  
done

我猜上面的脚本不会在每次处理单独的输入文件之间等待,而是一次启动它们。该程序生成许多子进程。任何指针表示赞赏。谢谢!

【问题讨论】:

  • 该代码中没有任何内容暗示它不会等待完成。
  • 这看起来像this package,它似乎已经进行了并行处理。不过,我认为我们需要了解更多细节才能准确了解问题所在;股票FrameDP.pl 本身并没有出现在背景中。
  • 是的,就是那个包,它确实做并行处理,但是在一个输入文件上。我想在几个输入文件上按顺序运行整个事情。也就是说,只需让它搅动输入文件,产生输出,然后在文件夹中获取下一个输入文件并重新开始。我可以通过在股票行的末尾添加一个 & 号来作为背景吗?
  • 谢谢伊格纳西奥。我没有尝试它,因为我已经在运行程序(占用了所有 CPU)。我只是假设它不会等待基于在线研究问题的完成。但我会在我的机器完成当前工作后尝试一下。
  • 按原样试用脚本,它只是循环并获取每个文件,同时为每个文件启动一个新进程。欢迎任何帮助让它等待每个作业完成,然后再开始使用新的输入文件。谢谢。

标签: bash shell scripting


【解决方案1】:

sh 循环没有并行化,你可以通过运行来验证它:

for i in *
    sleep 1
done

您会看到,如果您有 > 1 个文件,则总时间 > 1 秒但等于“文件数”秒。

因此,如果实际运行您提供的代码 sn-p 同时运行所有进程,那是因为您的 perl 脚本具有在后台运行的功能,您应该查看您的 perl 脚本,而不是您的 shell 脚本。

【讨论】:

    【解决方案2】:

    也许我想的太简单了,我来得太晚了,但是呢

    find . -depth 1 -exec ~/FrameDP/bin/FrameDP.pl --cfg ~/FrameDP/cfg/FrameDP.cfg --no_train --infile /home/bop08olp/FrameDP/data/{} --outdir ~/FrameDP/test \; &
    

    其中 {} 代替了以前的变量 $file 和 "\;"是 find 要求的序列来表示 exec 子句的结束吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多