我正在通过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运行应用程序来创建问题吗?
答案 0 :(得分:1)
问题是脚本执行过程正在运行的环境。我更改了流程的一些环境变量,现在一切正常。该脚本最初是一个独立的shell脚本,但我为每个使用的数据库编写了一个脚本。为了控制工作流程,我为此编写了一个Web应用程序,它为每个脚本调用单独的线程并可以管理线程。感谢您的回复!
答案 1 :(得分:0)
父JVM和子JVM应该是单独的进程,没有特别的理由说明它们应该干扰。
你得到什么错误?
你的PATH上是java吗?
好的,添加更多问题以回应您的评论...
哪个帖子正在等待?想必是父母?
孩子java进程,你有没有证据证明是否成功实施了。我的猜测是,孩子在某种程度上被阻止了。如果你杀了孩子那么父母会恢复生机吗?
假设它是一个简单的“hello world”应用程序,那会起作用吗?
答案 2 :(得分:0)
通常,应用服务器在“洁净室”环境中运行其servlet - 例如为了安全起见,它们会剥离通常从外部设置的所有变量。尝试使用java二进制文件的完全限定路径,并尝试为CLASS_PATH变量设置完整/绝对路径。
答案 3 :(得分:0)
最有可能是这一行:
CLASS_PATH="./lib/*"
并且
$CLASS_PATH
它不会被进程构建器扩展,因为它通常是shell的工作,在这种情况下不会被调用。
尝试创建./lib/*
的完整列表,并将其直接附加到脚本的最后一行。
java -classpath ./lib/a.jar:./lib/b.jar
旁注:
从java调用所有这些对我来说看起来很糟糕。我宁愿把它放在一个独立的脚本中,并通过其他方式调用它,但那就是我。