Как в Korn Shell правильно запустить из Java-прогарммы другую программу, являющуюся консольным приложением и написанную на другом языке (например, на Fortran)?
Я имею ввиду то, чтобы не было никаких зависаний и эта другая программа правильно производила ввод и вывод информации.
1613 г. = 2024 г.
Re: Как в Korn Shell правильно запустить из Java-программы другую программу?
Здравствуйте, RussianFellow, Вы писали:
RF>Как в Korn Shell правильно запустить из Java-прогарммы другую программу, являющуюся консольным приложением и написанную на другом языке (например, на Fortran)?
Korn Shell к запуску программ из Java не имеет ни малейшего отношения.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[2]: Как в Korn Shell правильно запустить из Java-программ
Есть Java-ская программа test1.jar, внутри которой происходит запуск Fortran-овской программы beg_matr. Всё это происчходит в Unix, в среде Korn Shell.
import java.lang.*;
import java.util.*;
import java.text.*;
import java.io.*;
import java.nio.*;
public class StreamGobbler1 extends Thread {
InputStream is;
String type;
StreamGobbler1 (InputStream is, String type) {
this.is = is;
this.type = type;
}
public void run() {
try {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line=null;
while ((line=br.readLine())!=null) System.out.println(type + ">" + line);
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
Код файла StreamGobbler2.java:
import java.lang.*;
import java.util.*;
import java.text.*;
import java.io.*;
import java.nio.*;
public class StreamGobbler2 extends Thread {
OutputStream os;
String type;
StreamGobbler2 (OutputStream os, String type) {
this.os = os;
this.type = type;
}
public void run() {
try {
/* InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line=null;
while ((line=br.readLine())!=null) System.out.println(type + ">" + line); */
OutputStreamWriter osr = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osr);
byte b[] = new byte[80];
while (System.in.read(b, 0, 80)!=-1) {
String s = new String(b);
s = type + ">" + s;
bw.write(s);
bw.newLine();
}
System.in.read(b, 0, 80);
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
Смысл такой: файл runtest.bat запускает программу test1.jar, имеющую оконный интерфейс. А из программы test1.jar при нажатии на кнопку "Запустить программу" должна вызываться программа beg_matr, работающая в консольном режиме. Однако в терминальном окне, появляющемся после запуска runtest1.bat, после нажатия на кнопку "Запустить программу", ничего не происходит--происходит зависание программы. В чём тут дело? Как исправить ошибку?
Текст файла runtest1.bat:
cd /home/KOL/ryk/CallTEMP
java -jar test1.jar
заменил разметку. тэг [q] предназначен для текстовых цитат, а не для кода. — Кодт
1613 г. = 2024 г.
Re[3]: Как в Korn Shell правильно запустить из Java-программ
Здравствуйте, RussianFellow, Вы писали:
RF>Однако в терминальном окне, появляющемся после запуска runtest1.bat, после нажатия на кнопку "Запустить программу", ничего не происходит--происходит зависание программы. В чём тут дело? Как исправить ошибку?
Метод exec() нормально отрабатывает? Исключение не бросает?
Вообще это больше по java вопрос, а не по unix.
RF>Текст файла runtest1.bat: RF>
Если файл имеет в точности такой вид, то он и не запустится. Для скриптов в первой строчке нужно указывать интерпретатор, например #!/bin/sh. Ну и бит executable должен быть установлен.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[4]: Как в Korn Shell правильно запустить из Java-программ
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, RussianFellow, Вы писали:
RF>>Однако в терминальном окне, появляющемся после запуска runtest1.bat, после нажатия на кнопку "Запустить программу", ничего не происходит--происходит зависание программы. В чём тут дело? Как исправить ошибку?
ДД>Метод exec() нормально отрабатывает? Исключение не бросает? ДД>Вообще это больше по java вопрос, а не по unix.
RF>>Текст файла runtest1.bat: RF>>
ДД>Если файл имеет в точности такой вид, то он и не запустится. Для скриптов в первой строчке нужно указывать интерпретатор, например #!/bin/sh. Ну и бит executable должен быть установлен.
Как установить бить executable ? (Я Unix и Korn Shell почти не знаю).
Кстати, из этого файла runtest1.bat мой JAR-файл test1.jar благополучно запускается. Не запускается только beg_matr из файла test1.jar .
1613 г. = 2024 г.
Re[5]: Как в Korn Shell правильно запустить из Java-программ
Здравствуйте, RussianFellow, Вы писали:
RF>Как установить бить executable ? (Я Unix и Korn Shell почти не знаю).
Вообщез
chmod a+x file
Но раз запускается, значит интерпретатор указан и executable бит выставлен.
RF>Кстати, из этого файла runtest1.bat мой JAR-файл test1.jar благополучно запускается. Не запускается только beg_matr из файла test1.jar .
Я не вижу кода, выполняющего запуск beg_matr. Отдельно, не из программы, он запускается?
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[6]: Как в Korn Shell правильно запустить из Java-программ
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, RussianFellow, Вы писали:
RF>>Как установить бить executable ? (Я Unix и Korn Shell почти не знаю).
ДД>Вообщез
chmod a+x file
ДД>Но раз запускается, значит интерпретатор указан и executable бит выставлен.
RF>>Кстати, из этого файла runtest1.bat мой JAR-файл test1.jar благополучно запускается. Не запускается только beg_matr из файла test1.jar .
ДД>Я не вижу кода, выполняющего запуск beg_matr. Отдельно, не из программы, он запускается?
Да, запускается.
1613 г. = 2024 г.
Re[7]: Как в Korn Shell правильно запустить из Java-программ
Здравствуйте, RussianFellow, Вы писали:
ДД>>Я не вижу кода, выполняющего запуск beg_matr. Отдельно, не из программы, он запускается? RF>Да, запускается.
Значит показывай код, который его пытается запускать.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[8]: Как в Korn Shell правильно запустить из Java-программ
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, RussianFellow, Вы писали:
ДД>>>Я не вижу кода, выполняющего запуск beg_matr. Отдельно, не из программы, он запускается? RF>>Да, запускается.
ДД>Значит показывай код, который его пытается запускать.
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, RussianFellow, Вы писали:
ДД>>>Значит показывай код, который его пытается запускать. RF>>Здесь:http://www.rsdn.ru/forum/unix/4925285.1
Здравствуйте, RussianFellow, Вы писали:
RF>Ой, прошу прощения, beg_matr а не run_bat .
На какой именно строчке "зависает"? Доходит ли управление до proc.waitFor()? Если да, то какое возвращается значение в exitVal? Если нет, выполняется ли блок catch {} ?
Как вообще этот beg_matr взаимодействует с окружающей средой? Читает данные из stdin? Может оно запускается, но ждет данных. А данные не поступают, т.к. inputGobbler, насколько могу понять, пытается копировать данные со своего stdin'а.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[12]: Как в Korn Shell правильно запустить из Java-программ
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, RussianFellow, Вы писали:
RF>>Ой, прошу прощения, beg_matr а не run_bat .
ДД>На какой именно строчке "зависает"? Доходит ли управление до proc.waitFor()? Если да, то какое возвращается значение в exitVal? Если нет, выполняется ли блок catch {} ?
Немножко модифицировал свой код--сделал так, чтобы на экран выводились сообщения о том, на каких шагах у меня выполняется программа:
В результате в терминальное окно выводится следующее:
Перед блоком try
перед вызовом Runtime.getRuntime().exec("beg_matr")
после Runtime.getRuntime().exec("beg_matr")
после ERROR
после OUTPUT
после INPUT
после errorGobbler.start()
после outputGobbler.start()
после inputGobbler.start()
После этого на экран ничего не выводится, если не нажимать Ctrl-C. При нажатии Ctrl-C на экран выводится следующее:
^Cпосле proc.waitFor()
после блока try--catch
Что это может означать?
ДД>Как вообще этот beg_matr взаимодействует с окружающей средой? Читает данные из stdin? Может оно запускается, но ждет данных. А данные не поступают, т.к. inputGobbler, насколько могу понять, пытается копировать данные со своего stdin'а.
Да, программа beg_matr выводит на экран (в терминальнео окно) строку сообщения--спрашивает, какое имя должно быть у файла данных, потом ждёт ввода этого файла, затем производит вычисления и выводит информацию в это терминальное окно. По мере своего выполнения прогармма beg_matr также несколько раз спрашивает пользователя, какие числовые значения, необходимые для вычислений, нужно ввести. Пользователь вводит эти значения, программа beg_matr продолжает счёт и в результате выводит результат вычислений на экран.
Как мне решить мою проблему? Как сделать так, чтобы прогарамма beg_matr нормально работала после запуска из прогарммы test1.jar ?
1613 г. = 2024 г.
Re[13]: Как в Korn Shell правильно запустить из Java-программ
Здравствуйте, RussianFellow, Вы писали:
RF>После этого на экран ничего не выводится, если не нажимать Ctrl-C. При нажатии Ctrl-C на экран выводится следующее:
RF>
beg_matr запустилась и чего-то ждет. Наверное, ждет данных со стандартного ввода. Когда приходит Ctrl-C, beg-matr завершается по сигналу. Если в сообщении после "proc.waitFor()" еще вывести значение exitVal, то скорее всего оно будет равно 130. Проверь на всякий случай, прав ли я в своих догадках.
RF>Да, программа beg_matr выводит на экран (в терминальнео окно) строку сообщения--спрашивает, какое имя должно быть у файла данных,
Эта строка завершается переводом на новую строку?
Судя по коду StreamGobbler1, он пытается прочитать целую строку от beg_matr и потом вывести ее в свой терминал. Если beg_matr выдает строку без перевода, то естественно br.readLine() будет ждать вечно.
Если же beg_mart выдает целую строку с переводом, то нужно разбираться, почему она не попадает в терминал запускающей программы. В этом случае советую расставить отладочные сообщения также в методе StreamGobbler1.run().
RF>потом ждёт ввода этого файла, затем производит вычисления и выводит информацию в это терминальное окно.
Вероятнее всего, она как раз и ждет имени этого файла. Попробуй его ввести в терминал запускающей программы. StreamGobbler2, теоретически, передаст его в beg_matr.
RF>По мере своего выполнения прогармма beg_matr также несколько раз спрашивает пользователя, какие числовые значения, необходимые для вычислений, нужно ввести. Пользователь вводит эти значения, программа beg_matr продолжает счёт и в результате выводит результат вычислений на экран.
В твоем случае эти данные должен вводить не пользователь, а запускающая программа, не так ли? Тогда нужно написать код в test1, который будет эти значения вводить вместо пользователя.
Вообще, если beg_matr диалоговая программа и работает линейно, то не понятно, зачем там вообще эти StreamGlobber'ы? После Runtime.getRuntime().exec() получаем Stream'ы и работаем с ними из основной нити.
RF>Как мне решить мою проблему? Как сделать так, чтобы прогарамма beg_matr нормально работала после запуска из прогарммы test1.jar ?
Итого: подавать ей на вход данные, в том порядке и формате, которые она ожидает.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[14]: Как в Korn Shell правильно запустить из Java-программ
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, RussianFellow, Вы писали:
RF>>После этого на экран ничего не выводится, если не нажимать Ctrl-C. При нажатии Ctrl-C на экран выводится следующее:
RF>>
RF>>Что это может означать?
ДД>beg_matr запустилась и чего-то ждет. Наверное, ждет данных со стандартного ввода. Когда приходит Ctrl-C, beg-matr завершается по сигналу. Если в сообщении после "proc.waitFor()" еще вывести значение exitVal, то скорее всего оно будет равно 130. Проверь на всякий случай, прав ли я в своих догадках.
RF>>Да, программа beg_matr выводит на экран (в терминальнео окно) строку сообщения--спрашивает, какое имя должно быть у файла данных,
ДД>Эта строка завершается переводом на новую строку? ДД>Судя по коду StreamGobbler1, он пытается прочитать целую строку от beg_matr и потом вывести ее в свой терминал. Если beg_matr выдает строку без перевода, то естественно br.readLine() будет ждать вечно. ДД>Если же beg_mart выдает целую строку с переводом, то нужно разбираться, почему она не попадает в терминал запускающей программы. В этом случае советую расставить отладочные сообщения также в методе StreamGobbler1.run().
RF>>потом ждёт ввода этого файла, затем производит вычисления и выводит информацию в это терминальное окно.
ДД>Вероятнее всего, она как раз и ждет имени этого файла. Попробуй его ввести в терминал запускающей программы. StreamGobbler2, теоретически, передаст его в beg_matr.
RF>>По мере своего выполнения прогармма beg_matr также несколько раз спрашивает пользователя, какие числовые значения, необходимые для вычислений, нужно ввести. Пользователь вводит эти значения, программа beg_matr продолжает счёт и в результате выводит результат вычислений на экран.
ДД>В твоем случае эти данные должен вводить не пользователь, а запускающая программа, не так ли? Тогда нужно написать код в test1, который будет эти значения вводить вместо пользователя. ДД>Вообще, если beg_matr диалоговая программа и работает линейно, то не понятно, зачем там вообще эти StreamGlobber'ы? После Runtime.getRuntime().exec() получаем Stream'ы и работаем с ними из основной нити.
RF>>Как мне решить мою проблему? Как сделать так, чтобы прогарамма beg_matr нормально работала после запуска из прогарммы test1.jar ?
ДД>Итого: подавать ей на вход данные, в том порядке и формате, которые она ожидает.
Программа beg_matr сперва выводит сообщение
ИМЯ ФАЙЛА С ИСХОДНЫМИ ДАННЫМИ (БЕЗ РАСШИРЕНИЯ! DATA.PMO ПО УМОЛЧАНИЮ)
затем происходит переход на новую строку, где пользователь вводит имя файла (если он просто нажал ввод, то считается, что имя этого файла--DATA.PMO).
После этого программа beg_matr производит вычисления и выводит результаты на экран.
exitValue возвращает 130 .
Так как мне решить мою проблему? Моя программа test1 должна передавать значения вводимых данных в соответствующие потоки?
1613 г. = 2024 г.
Re[15]: Как в Korn Shell правильно запустить из Java-программ
Здравствуйте, RussianFellow, Вы писали:
RF>Программа beg_matr сперва выводит сообщение RF>
RF>ИМЯ ФАЙЛА С ИСХОДНЫМИ ДАННЫМИ (БЕЗ РАСШИРЕНИЯ! DATA.PMO ПО УМОЛЧАНИЮ)
RF>затем происходит переход на новую строку,
Стоило бы разобраться, почему в таком случае эта строка не попадает в System.out.println().
RF>Моя программа test1 должна передавать значения вводимых данных в соответствующие потоки?
Да. В приведенном коде StreamGobbler2 передает дочернему процессу данные, прочитанные из stdin, причем почему-то по 80 байт, а не строками, и очевидно совсем не в том виде, как ожидает beg_matr.
RF>Так как мне решить мою проблему?
Изучать Java.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[16]: Как в Korn Shell правильно запустить из Java-программ
Здравствуйте, ДимДимыч, Вы писали:
RF>>Моя программа test1 должна передавать значения вводимых данных в соответствующие потоки?
ДД>Да. В приведенном коде StreamGobbler2 передает дочернему процессу данные, прочитанные из stdin, причем почему-то по 80 байт, а не строками, и очевидно совсем не в том виде, как ожидает beg_matr.
И как же правильно считывать строки, если в stdin проводятся операции только с байтами?
1613 г. = 2024 г.
Re[17]: Как в Korn Shell правильно запустить из Java-программ
Здравствуйте, RussianFellow, Вы писали:
RF>И как же правильно считывать строки, если в stdin проводятся операции только с байтами?
С чего бы это?
Откуда код этих StreamGobbler'ов взялся? Похоже, изначально это был какой-то демонстрационный код, который делал не совсем то, что нужно в твоем случае.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[18]: [-] ДимДимычу респектище за мегатерпение %)