繁体   English   中英

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

[英]Running linux process from servlet useing Runtime.exec()

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

例如:Runtime rt = Runtime.getRuntime(); 进程proc = rt.exec(“ linux command”); int exitVal = proc.waitFor(); //可能要等5至10分钟

您需要注意一些事项:

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

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

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

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

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

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

  1. 必须以受限帐户调用Tomcat。 所以您可能会因为权限问题而头痛
  2. 用户将超时,因此永远不会传递HTTP内容
  3. 没有授予servlet不会终止的授权-因此您的进程将是僵尸

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

您对运行时环境的了解还不够。 尽管问题标题提到servlet,并且该问题已用servlet标记,但您未指定任何特定的运行时环境。

您问题的答案取决于与用例有关的非常具体的情况。 例如,如果您有一个人流量大的站点,在该站点上访问任何页面都可能会产生一个新的过程,该过程将运行几分钟,这听起来并不是一个好的设计,因为任何服务器都可以轻松地进行爬网。这样的情况。 另一方面,如果您有一些特定的长期运行任务需要在单独的流程中运行并通过访问网页来触发,在该网页中这种访问和流程的创建是受控的和确定性的,则可以这样做这个。 没有实际的技术障碍。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM