Как выполнить скрипт oraenv с помощью Java-программы? - PullRequest
0 голосов
/ 15 мая 2018

Как выполнить скрипт oraenv с помощью Java-программы?Как выполнить из терминала Linux.

 [oracle@DeltaLinOraASM2 tmp]$ . oraenv
 ORACLE_SID = [oracle] ? deltaasm
 The Oracle base has been set to /u01/app/oracle
 [oracle@DeltaLinOraASM2 tmp]$

Мой файл сценария oraenv содержит следующее:

export ORACLE_HOME=/opt/oracle/product/12.2.0.1/dbhome_1
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_SID=deltaasm

Как выполнить файл oraenv с помощью Java-программы.

Itспрашивает ORACLE_SID =?после выполнения скрипта.Но из программы это не выполняется.

public class App2 {

public static String RunLinuxGrepCommand(String command) {
    String line = null;
    String strstatus = "";
    try {

        String[] cmd = { "/bin/sh", "-c", command };
        Process p = Runtime.getRuntime().exec(cmd);
        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while ((line = in.readLine()) != null) {
            strstatus = line;
        }
        in.close();
    } catch (Exception e) {

        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        e.printStackTrace(pw);
        pw.flush();
        String stackTrace = sw.toString();
        int lenoferrorstr = stackTrace.length();
        if (lenoferrorstr > 500) {
            strstatus = "Error:" + stackTrace.substring(0, 500);
        } else {
            strstatus = "Error:" + stackTrace.substring(0, lenoferrorstr - 1);

        }
    }
    System.out.println("strstatus" + strstatus);
    return strstatus;

}

public static void main(String[] args) throws IOException {

    String str = ". oraenv ; deltaasm ";
    App2.RunLinuxGrepCommand(str);

}
}

enter image description here

1 Ответ

0 голосов
/ 15 мая 2018

Вам необходимо понять, что происходит, когда вы используете exec в Java:

  1. Создан новый внешний процесс.
  2. Процесс выполняет команду, которую вы дали
  3. Процесс завершается.

Например, если вы сделаете это:

  exec(". oraenv");
  exec("someOracleCommand");

что будет:

  1. Первые процессы созданы.
  2. Первый процесс выполняет переменные окружения установки ". Oraenv" для этого процесса .
  3. Первый процесс завершается.
  4. Второй процесс создан.
  5. Второй процесс выполняет someOracleCommand со средой по умолчанию.
  6. Второй выход из процесса.

Видите проблему? Настройки переменных среды не передаются из первого процесса во второй.

На самом деле, то, что я сказал выше, не соответствует действительности. Запуск ". Oraenv", как это не будет работать ни при каких обстоятельствах. "." Команда является встроенной оболочкой и недоступна, если вы не используете оболочку. Что вышеупомянутое не делает. exec(". orenv") не удастся.

Решение: вам нужно запустить . oraenv и команду в одной оболочке, примерно так:

  exec("/bin/bash", "-c",
       ". oraenv ; someOracleCommand");

То, что мы сделали, это поместили последовательность команд оболочки в одну строку и передали ее в оболочку для выполнения. Оболочка понимает, как анализировать последовательность команд ... и устанавливает переменные среды в среде оболочки так, чтобы они были доступны для следующих команд, выполняющихся в оболочке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...