使用Runtime.exec()从servlet运行linux进程

时间:2009-08-13 15:17:35

标签: java linux servlets

在多用户环境中运行linux进程是个好主意。

Ex:Runtime rt = Runtime.getRuntime();             进程proc = rt.exec(“linux命令”);             int exitVal = proc.waitFor(); //可能要等到5到10分钟

3 个答案:

答案 0 :(得分:4)

你需要注意一些事情:

  • 如果进程使用文件,则必须确保每个进程都有自己的集合,否则它们将覆盖彼此的输入/输出。使用File.createTempFile()

  • 进程将使用服务器的用户权限运行。

  • 如果该过程获取了用户可以在浏览器中更改的数据,请确保他无法发送"; rm -rf /"之类的内容。

  • 如果进程运行的时间超过几秒,则必须在后台运行它并解析输出以查看它何时完成。由于错误处理,这可能会很快变得毛茸茸,你需要在会​​话中保持对正在运行的进程的引用等。

除此之外,没有理由害怕这一点。 Unix是一个服务器操作系统,旨在同时运行许多流程:)

答案 1 :(得分:1)

这是个糟糕的主意。

  1. 必须在受限制的帐户下调用Tomcat。所以你可能会对权限感到头疼
  2. 用户将获得超时,因此永远不会传递HTTP内容
  3. 没有授予servlet不会终止的权限 - 所以你的进程将是zombie
  4. 尝试启动进程,但是通过来自客户端浏览器的定期ping来通过看门狗模式监视它们

答案 2 :(得分:0)

您对运行时环境的评价不够;虽然问题标题提到servlet并且问题是用servlet标记的,但是你没有指定任何特定的运行时环境。

您的问题的答案取决于与您的用例相关的非常具体的情况。例如,如果您有一个高流量站点,访问任何页面可能会产生一个可能运行几分钟的新进程,这听起来不是一个好的设计,因为任何服务器都可能很容易被归结为爬行这样的场景。另一方面,如果您有一些特定的长期运行任务需要在一个单独的流程中运行,并且通过访问这样的访问和流程创建受到控制和确定性的网页来触发,那么可能就可以了这个。没有实际的技术障碍。

请注意,如果您使用的是最新版本的Java,则使用ProcessBuilder比使用较早的Runtime.exec更为可取。