【问题标题】:Running linux process from servlet useing Runtime.exec()使用 Runtime.exec() 从 servlet 运行 linux 进程
【发布时间】:2009-08-13 15:17:34
【问题描述】:

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

例如:运行时 rt = Runtime.getRuntime(); 进程 proc = rt.exec("linux 命令"); int exitVal = proc.waitFor(); // 可能会等到 5 到 10 分钟

【问题讨论】:

    标签: java linux servlets


    【解决方案1】:

    你需要注意一些事情:

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

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

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

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

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

    【讨论】:

    • 我要补充一点,您应该考虑该过程可能运行多长时间,以及连接是否可能在完成之前超时。如果你在谈论一些简短、快速的过程,我同意 Aaron 的观点。如果这是一项重要的工作,您可能需要考虑分拆另一个线程或类似的线程。
    【解决方案2】:

    这是一个非常糟糕的主意。

    1. Tomcat 必须在受限帐户下调用。所以你可能会对权限感到头疼
    2. 用户将超时,因此永远不会传送 HTTP 内容
    3. 没有授权 servlet 不会被终止 - 所以你的进程将是僵尸

    尝试启动进程,但通过客户端浏览器定期 ping 的看门狗模式监控它们

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-20
        • 2014-11-10
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 1970-01-01
        • 2015-06-21
        • 1970-01-01
        相关资源
        最近更新 更多