JAVA - .sh文件从终端执行但不通过JAVA代码执行

时间:2018-02-14 07:07:55

标签: java shell sh

我有一个JAVA代码来创建和执行.sh文件。问题是 - .sh文件正在创建,但没有通过JAVA代码执行。从终端或cronjob手动运行时,它会被执行。最大的问题是 - 相同的代码在所有DEV服务器上都能正常工作,但在使用CentOS 6.8的客户端PROD环境中却没有。它在使用CentOS 6.5的Client UAT环境中也能正常工作。

代码在应用程序服务器上创建可执行的sh文件并执行它。 sh文件包含命令sqlldr和sqlplus通过批量上传机制上传数据。成功执行后,将创建一个包含执行输出的日志文件。任何错误都写在日志文件中。不执行sh文件时,也不会创建日志文件。当从终端手动执行时,执行sh文件并创建日志文件。以下是sh文件的内容

sqlldr user/pass@db CONTROL=CTL_1000004453.ctl silent=all
echo -e "UPDATE QT_BATCH_UPLOAD SET UPLOAD_STATUS = 20 WHERE UPLOAD_ID = 1000004453;
commit;
exit;
" > SET_STATUS_1000004453.SQL
sqlplus user/pass@db @SET_STATUS_1000004453.SQL

在应用程序和服务器日志中未获得任何错误。应用程序正在Weblogic服务器上运行。我检查并根除了所有与许可相关的问题。

如果有人遇到过这种非复制性问题,请提供帮助。

以下是代码。

        try
        {

          Runtime rt = Runtime.getRuntime();
          Process pr = rt.exec(new String[] { "/bin/bash", "-c", "cd " + path + " ;chmod a+x " + exeFile + "; sh " + exeFile + ";" });

          BufferedReader br = new BufferedReader(new InputStreamReader(pr.getInputStream()));

          FileOutputStream file3 = new FileOutputStream(path + "CONSOLE_" + uploadID + ".LOG");
          String line; while ((line = br.readLine()) != null) { String line;
            System.out.println(line);
            file3.write((line + System.getProperty("line.separator")).getBytes());
            file3.flush();
          }
          file3.close();

        }

1 个答案:

答案 0 :(得分:0)

问题已经解决。不需要更改代码。实际上,应用服务器(Weblogic)正在通过控制台运行。我做了一些R& D并要求客户端通过putty / terminal运行它,帖子,代码运行正常。

当weblogic通过控制台运行时,我仍然会寻找能够实现同样功能的解决方案。