【问题标题】:Running a java application through shell script in a JSP/Servlet通过 JSP/Servlet 中的 shell 脚本运行 java 应用程序
【发布时间】:2009-10-15 15:54:42
【问题描述】:

我正在通过 Web 应用程序运行 shell 脚本。这个 shell 脚本看起来像

`#! /bin/bash
user=""
pass=""
db_url=""
db_instance=""
sqlplus -s $user/$pass@$db_url/$db_instance @ ./SqlScripts/foo.sql
sqlplus -s $user/$pass@$db_url/$db_instance @ ./SqlScripts/bar.sql
CLASS_PATH="./lib/*"
java -classpath $CLASS_PATH package.Main ./Data/inputfile`

我正在使用 ProcessBuilder 来运行脚本,除了最后一行之外的所有内容都可以正常工作。我通过 jvm 调用 shell 然后再次调用 jvm 来运行应用程序是否会产生问题?

【问题讨论】:

  • 它会给出错误信息吗?当它不能正常工作时,你怎么知道? :-)
  • 没有错误信息。只是没有输出,并且在通过 Web 应用程序运行时挂起。线程进入等待状态,永不离开。
  • -1 输入错误。凯尔,如果您发布实际代码(甚至是实际示例)会容易得多

标签: java web-applications shell


【解决方案1】:

问题是脚本执行进程运行的环境。我更改了进程的一些环境变量,现在一切正常。该脚本最初是一个独立的 shell 脚本,但我为每个使用的数据库编写了一个脚本。为了控制工作流程,我为此编写了一个 Web 应用程序,它为每个脚本调用单独的线程并可以管理线程。感谢您的回复!

【讨论】:

    【解决方案2】:

    通常,应用服务器在“洁净室”环境中运行其 servlet - 例如。出于安全原因,它们去除了通常从外部设置的所有变量。尝试使用 java 二进制文件的完全限定路径,并尝试为 CLASS_PATH 变量设置完整/绝对路径。

    【讨论】:

    • 应用服务器和独立应用,问题在于 $ENV_VAR 是 shell 理解的东西,而不是程序。任何其他编程语言也是如此。
    【解决方案3】:

    父 JVM 和子 JVM 应该是独立的进程,没有特别的理由让他们干涉。

    你得到什么错误?

    你的 PATH 上有 java 吗?

    好的,添加更多问题以回应您的 cmets ...

    哪个线程在等待?估计是家长?

    子java进程,你有任何证据证明是否成功初始化。我的猜测是孩子在某种程度上被阻止了。如果你杀了孩子,父母会复活吗?

    假设它是一个简单的“hello world”应用程序,这样行吗?

    【讨论】:

    • 是的,java 在 PATH 上。没有错误只是挂起,线程永远不会离开等待状态。
    【解决方案4】:

    最有可能的行:

    CLASS_PATH="./lib/*"
    

    还有

    $CLASS_PATH
    

    它不会被进程构建器扩展,因为这通常是 shell 的工作,在这种情况下不会被调用。

    尝试创建./lib/* 的完整列表并将其直接附加到脚本的最后一行。

    java -classpath ./lib/a.jar:./lib/b.jar
    

    旁注:

    从 java 调用所有这些对我来说看起来很糟糕。我宁愿将它放在一个独立的脚本中,并通过其他方式调用它,但这就是我。

    【讨论】:

    • 这只是一个例子......不是实际的脚本
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2019-12-16
    • 1970-01-01
    相关资源
    最近更新 更多