在java中作为线程执行shell脚本

时间:2014-02-25 15:39:54

标签: java shell

我需要在java程序中执行shell脚本。我发现我可以使用processbuilder和runtime.exec ..但是我的网络服务器每180秒超时但是我的脚本执行需要更多...我不想使用这种方法的过程..有没有其他方法在哪里我可以使用线程执行此操作。

感谢。

3 个答案:

答案 0 :(得分:1)

我假设脚本的响应是供人阅读的。

良好的界面设计和人性化表明,如果您的脚本运行时间超过180秒,那么它应该与Web服务器分开运行。在linux上,我建议将它放入'cron',并让它定期运行。您只能通过Web服务器提供脚本的结果,响应时间以秒为单位而不是几分钟。

如果您的脚本依赖于http请求中的参数或仅在Web服务器环境中提供的其他信息,则您有以下选择。

  1. 如果您可以找出可能的参数组合,请运行 每个参数组合自动编写脚本, 再次只通过网络提供结果。
  2. 如果大部分时间都花在一个命令上,那么 该命令的结果在运行之间没有太大变化,移动它 命令进入一个自动运行的单独脚本,然后使用 用于构建Web响应的单独脚本的结果。
  3. 将响应分解为段,仅显示部分内容 每个请求的数据,允许用户通过页面进行翻页 响应。该脚本将被重写为仅请求 当前页面的必要数据,减少了时间 需要获得这些数据。
  4. 以可编辑的语言重写脚本,可能让您有足够的时间为每个合理的请求运行它。但是,如果问题是数据库查询,这对您没有任何好处。你必须选择(3),无论你是否用可编译的语言重写它。
  5. 如果没有其他信息,例如脚本的示例,或者您从哪里获得结果的说明,那就是我能做的最好的事情。

答案 1 :(得分:0)

进程可以运行多个线程,但它们仍然是进程的一部分。

因此,java程序中的所有线程都是java进程的线程,并且线程无法运行另一个程序的线程。

shell脚本由程序运行:shell程序! (/ bin / bash或/ bin / sh)

无论如何,shell脚本将主要在其他几个进程中运行其他程序。

不,你不能在java的一个线程中运行一个shell。

答案 2 :(得分:-1)

通常,如果您的代码与Java程序不同,例如单独脚本中的代码,那么当代码可以集成到代码中时,没有理由说明代码执行外部脚本的原因。该程序。它充其量是不安全的。由于外部脚本是可编辑的,因此您的程序基本上允许任意代码执行。你在做什么听起来几乎像它应该被限制在单元测试或构建任务。

作为单元测试任务,您可以使用线程JUnit运行程序在项目的测试阶段运行外部脚本。

此外,与您的程序分开,您也可以使用Gradle任务并使用Gradle具有的parallellforks option来执行它。