从作为后台作业运行的shell脚本生成进程

时间:2012-07-18 15:31:21

标签: java multithreading shell

我正在开发一个Web应用程序,我在前端运行Java,后端运行shell脚本。该应用程序主要是分析许多文件,java程序从用户获取输入,例如他们想要分析哪个文件,从哪个日期到他们想要分析的日期。让我们假设用户从7月1日到8日提供数据。我需要处理8天的文件。每天大约有100个文件需要处理。所以我的目标是并行执行此过程而不是执行此顺序。我基本上有两个想法。我想与你分享这个,并得到你的建议。

计划1:           有一个Java程序(Business Layer),它使用流程构建器调用shell脚本。我可以将用户的给定日期(例如(1-8))拆分为4个线程,其中每个线程将执行两天的操作。例如(1-2)线程1和(3-4)线程2,它继续。如果我遵循这种方法,那么所有的优点和缺点是什么。另外,这种方法如何在线程之间进行协调。

计划2:           从Java调用shell脚本,在shell脚本中生成多个进程,正如我之前所说,我可以生成进程1来完成日期(1-2)和进程2(3-4)的工作,然后继续。这种方法的优点和缺点是什么?我正在将处理后的输出写入单个文件。因此,如果我有多个进程,如何通过多个进程更新单个文件。

此外,任何与我的问题相关的链接的引用

重要: 正如我所说,我需要在shell脚本中每天处理100个日志文件,我的一个要求是不断更新我的前端环境,关于我在shell脚本中的作业状态(即)第1天已完成,日2已完成,等等。我知道我可以从shell脚本做回声,然后我可以从Java获得值。但问题是如果我在shell脚本中做回声,在处理文件的循环中,我的调用终止,我再次不得不从Java回调。有关如何进行此更新的任何想法。

1 个答案:

答案 0 :(得分:1)

首先,我建议考虑优化的第一条规则:不要优化。

然后,如果你真的认为你需要优化它,我会选择第一种方法并尽可能地用Java做。

一种方法可能如下: 1)使用ProcessBuilder运行所有进程并创建List<Process> 2)将每个进程包装到ShellScriptProcess中并获取List<ShellScriptProcess>

class ShellScriptProcess implements Runneable() {

  private Process process;
  public ShellScriptProcess(Process process) {
     this.process=process;
  }

  boolean synchronized finished = false;
  public void run() {
    process.waitFor(); //this will wait until the process terminates
    finished = true;
  }
  public boolean isFinished(){
    return finished;
 }
}

3)等待进程完成

while(!allFinished) {
    for (ShellScriptProcess sp : shellScriptProcesses) {
      allFinished = true;
      if (sp.isFinished()) {
          // hurray, a process has finished, inform the UI
          // you want to do something smarter here though, 
          //like removing the finished processes from the list
      }
      else {
          allFinished = false;
      }
   }
}

这只是一个非常粗略的解决方案,只是为了展示如何实现这一目标的想法。我没有测试代码,它可能包含语法错误:)希望这会有所帮助。