【发布时间】:2009-08-13 15:17:34
【问题描述】:
在多用户环境下运行linux进程是不是个好主意。
例如:运行时 rt = Runtime.getRuntime(); 进程 proc = rt.exec("linux 命令"); int exitVal = proc.waitFor(); // 可能会等到 5 到 10 分钟
【问题讨论】:
在多用户环境下运行linux进程是不是个好主意。
例如:运行时 rt = Runtime.getRuntime(); 进程 proc = rt.exec("linux 命令"); int exitVal = proc.waitFor(); // 可能会等到 5 到 10 分钟
【问题讨论】:
你需要注意一些事情:
如果进程使用文件,则必须确保每个进程都有自己的集合,否则它们将覆盖彼此的输入/输出。使用File.createTempFile()。
进程将以服务器的用户权限运行。
如果进程获取用户可以在浏览器中更改的数据,请确保他不能发送"; rm -rf /"之类的内容。
如果进程运行时间超过几秒钟,您必须在后台运行它并解析输出以查看它何时完成。由于错误处理,这可能会很快变得棘手,您需要在会话中保留对正在运行的进程的引用等。
除此之外,没有理由害怕这一点。 Unix 是一种服务器操作系统,旨在同时运行许多、许多进程:)
【讨论】:
这是一个非常糟糕的主意。
尝试启动进程,但通过客户端浏览器定期 ping 的看门狗模式监控它们
【讨论】:
您对运行时环境的描述还不够;虽然问题标题提到了 servlet 并且问题用 servlet 标记,但您没有指定任何特定的运行时环境。
您的问题的答案取决于与您的用例相关的非常具体的情况。例如,如果您有一个高流量站点,访问任何页面都可能产生一个运行几分钟的新进程,这听起来不是一个好的设计,因为任何服务器都可能很容易陷入爬网状态这样的场景。另一方面,如果您有一些特定的长时间运行的任务需要在单独的进程中运行并通过访问此类访问和进程创建受控制且确定性的网页来触发,那么可能可以这样做这个。没有实际的技术障碍。
请注意,如果您使用的是最新版本的 Java,则使用 ProcessBuilder 比使用旧版 Runtime.exec 更可取。
【讨论】: