Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Внешний процесс из Java / 9 сообщений из 9, страница 1 из 1
19.04.2013, 21:51:48
    #38233529
Insane_1990
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний процесс из Java
Добрый вечер, уважаемые.

Сразу извиняюсь за возможный повтор вопроса или темы.
Возник следующий вопрос: как отследить из Java, запустился ли сторонний процесс?

Выполняю следующее:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public void actionPerformed(ActionEvent e) {
	              Runtime r = Runtime.getRuntime();
try{
		proc = Runtime.getRuntime().exec("java -jar NoSQL_Storage\\kv-ee-2.0.26\\kv-2.0.26\\lib\\kvstore.jar kvlite");

			  } catch ( Throwable ex ) {
				  JOptionPane.showMessageDialog(
								  noSqlPanel,
								  "An error accuses during start KVStore: " + ex.getMessage(),
								  "Error",
								  JOptionPane.ERROR_MESSAGE);
}
if ( proc.isAlive() ) System.out.println("Process started!!!!");



Он запускает процесс, все окей. Но, если изменить путь, или название файла, которого в общем то нет вообще, то процесс не запустится, это видно из диспетчера задач, но все равно выведет что "Process started!!!!". Как узнать, запустился ли процесс или нет?

Спасибо большое!!!!
...
Рейтинг: 0 / 0
19.04.2013, 22:05:13
    #38233534
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний процесс из Java
Почуствуйте разницу.
"Процесс запустился и завершился через секунду" и "Процесс запустился и не завершился".
В обоих случаях процесс запустился что вы и проверяете.
Посмотрите ProcessBuilder, Process.waitFor();
...
Рейтинг: 0 / 0
19.04.2013, 22:10:32
    #38233537
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний процесс из Java
BlazkowiczПочуствуйте разницу.
"Процесс запустился и завершился через секунду" и "Процесс запустился и не завершился".
В обоих случаях процесс запустился что вы и проверяете.
Посмотрите ProcessBuilder, Process.waitFor();

Так waitFor же блокирует основной поток, пока запущенный не выполнится? Или я путаю.
Я думаю ТС надо отследить что процесс запустился и работает, и продолжать какую-то свою логику а не блокироваться..
А вот тут я хз как это сделать платформенно-независимым образом
...
Рейтинг: 0 / 0
19.04.2013, 22:12:29
    #38233538
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний процесс из Java
забыл никТак waitFor же блокирует основной поток, пока запущенный не выполнится? Или я путаю.
Я думаю ТС надо отследить что процесс запустился и работает, и продолжать какую-то свою логику а не блокироваться..
А вот тут я хз как это сделать платформенно-независимым образом
Дык вопрос не в том как сделать. Вопрос в том что именно нужно отследить и для чего. Ну, и никто не мешает запускать дополнительные потоки чтобы мониторить состояние процесса.
...
Рейтинг: 0 / 0
19.04.2013, 22:15:35
    #38233542
Insane_1990
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний процесс из Java
Blazkowicz, мне надо понять, запустился мой процесс или нет, работает он или нет. waitFor тут не подойдет, потому что, насколько я понял, он будет ждать пока я не завершу процесс сам, руками.

А мне очень нужно для логики внутренней понять, запустился процесс или нет, и выдать соответствующую ошибку или не ошибку пользователю. Если Вы говорите, что можно через потоки сделать, не могли бы Вы, пожалуйста, показать пример небольшой?
...
Рейтинг: 0 / 0
19.04.2013, 22:42:09
    #38233555
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний процесс из Java
Insane_1990Blazkowicz, мне надо понять, запустился мой процесс или нет, работает он или нет. waitFor тут не подойдет, потому что, насколько я понял, он будет ждать пока я не завершу процесс сам, руками.
Процесс запускается в обоих случаях. Это важно, не игнорируйте.
Процесс который вам нужен запускается и что-то делает. Вам важны результаты его работы. Вот и попробуйте сформулировать точный критерий чем процесс запустившийся и выполнивший задачу отличается от процесса запустившегося и не выполнившего свою задачу. Просто человеческим языком сформулируруйте максимально точный критерий.

Insane_1990А мне очень нужно для логики внутренней понять, запустился процесс или нет, и выдать соответствующую ошибку или не ошибку пользователю. Если Вы говорите, что можно через потоки сделать, не могли бы Вы, пожалуйста, показать пример небольшой?

Например так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
new Threads(){
     public void run(){
          process.waitFor();
          if(succeed){
              //process ended and did job
          }else{
              //process ended and failed
          } 
     }
}.start();
...
Рейтинг: 0 / 0
19.04.2013, 22:57:23
    #38233561
Insane_1990
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний процесс из Java
Blazkowicz,
исходя из Ваших слов, правильно ли я понял, что для компилятора пуск процесса произойдет в любом случае, не зависимо от того, запустится этот процесс физически или нет?
...
Рейтинг: 0 / 0
19.04.2013, 23:13:40
    #38233567
Сено
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний процесс из Java
Insane_1990,
Делается следующим образом.

1) Стартуете процесс. Если он даже не смог запустится, будет брошен exception (например, если ОС не смогла понять, что запускать по "java")

2) Когда процесс застартует начинаете читать его output/error стримы. ВАЖНО! error стрим надо вычитывать в обязательном порядке, иначе можете зависнуть, когда его буффер заполнится.

3) Парсите выхлоп процесса и решаете, выполнил он необходимое действие или нет.

Так работают очень многие фичи, в которых необходимо как-то взаимодействовать с процессом. Например, именно таким образом у вас в IDE отображает выхлоп ваших тестов или застартованного сервера, или thread dump, и т.д..

Ну и вообще, важно хорошо понимать, что есть всего два способа взаимодействия с процессом:
1) Стандартные input/output/error стримы.
2) Кастомное взаимодействие, основанное на сайд-эффектах работы процесса. Например, синхронизационные примитивы ОС (мьютексы, семафоры, и т.д.), какие-нибудь файлы, которые плодит этот процесс, shared memory / memory mapped files, и т.д. и т.д.
Все, принципиально иных способов взаимодействия с процессом нет.
...
Рейтинг: 0 / 0
20.04.2013, 03:43:49
    #38233649
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Внешний процесс из Java
Кстати да я вспомнил что вычитывал поток процесса и искал там определённую строку. А во втором процессе после запуска, если все ок писал в поток эту самую строку
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Внешний процесс из Java / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]