首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从作为后台作业运行的shell脚本派生进程

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

Stack Overflow用户
提问于 2012-07-18 23:31:21
回答 1查看 745关注 0票数 0

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

计划1:有一个Java程序(业务层),它使用进程构建器调用shell脚本。我可以按用户将给定的日期拆分为4个线程,每个线程执行两天的操作吗?例如(1-2)线程1和(3-4)线程2,它继续下去。如果我遵循这种方法,那么所有的利弊都是什么?另外,如何通过这种方法在线程之间进行协调。

计划2:从Java调用shell脚本,在shell脚本内部生成多个进程,正如我前面所说的,我可以派生进程1来完成date (1-2)和进程2 (3-4)的工作,然后继续下去。这种方法的优点和缺点是什么?我将处理后的输出写入到一个文件中。那么,如果我有多个进程,如何让多个进程更新单个文件。

还有与我的问题相关的任何链接的任何引用

重要:正如我所说的,我每天都需要在shell脚本中处理100个日志文件,我的要求之一是不断更新前端环境,了解shell脚本中作业的状态(即第一天已经完成,第二天已经完成等等)。我知道我可以从shell脚本中执行echo,然后我就可以从Java中获得值。但问题是,如果我在shell脚本中回显,在处理文件的循环中,我的调用终止,我必须再次从Java回调。任何关于如何使此更新发生的想法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-19 00:32:30

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

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

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

代码语言:javascript
运行
复制
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)等待进程完成

代码语言:javascript
运行
复制
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;
      }
   }
}

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

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

https://stackoverflow.com/questions/11544955

复制
相关文章

相似问题

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