Как завершить процесс, который обычно создается с помощью ProcessBuilderJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как завершить процесс, который обычно создается с помощью ProcessBuilder

Сообщение Anonymous »

Я создаю процессы с помощью ProcessBuilder в своем Java-приложении. Созданный процесс выполняет некоторые команды FFMPEG, которые фактически копируют потоки RTSP в указанный целевой медиафайл.

Код: Выделить всё

ProcessBuilder builder = new ProcessBuilder("ffmpeg", "-i", RTSP_URL, "-f", fileFormat, destFilePath);
Process processToExecute = builder.start();
Я хочу закрыть процесс до того, как он завершит свое выполнение. Итак, если я запустил эту команду FFMPEG непосредственно в Windows CMD, а затем нажму «CTRL + C» через 5 секунд, процесс завершится со статусом «2». И я могу воспроизвести созданный на данный момент медиафайл.
Итак, если я выполню ту же операцию в своем Java-приложении, используя:

Код: Выделить всё

 process.destroy(); //I call this method after 5 sec
Я получаю код состояния «1», что означает ненормальное завершение. Статус получаю следующим образом:

Код: Выделить всё

 processToExecute.destroy();
processToExecute.exitValue(); //This return me status '1'
И я не могу воспроизвести медиафайл, и я думаю, что это связано с ненормальным завершением процесса.
Итак, как мне завершить процесс, созданный с помощью ProcessBuilder, так же, как мы делаем это в CMD с помощью (CTRL+C), чтобы я мог воспроизвести созданный медиафайл?
Я хочу завершить процесс (созданный с помощью ProcessBuilder) в Java-приложении с кодом состояния «2», который я получаю при завершении процесса с помощью CMD.
EDIT#01: --- Обмен результатами
Итак, когда я пытаюсь удалить этот файл после завершения работы приложения, я получаю следующую ошибку:

Код: Выделить всё

The Action Can't be Performed Because File is Opened in FFMPEG.exe
Это означает, что процесс не завершает команду, которую он выполняет. Эта команда все еще занимает этот файл, поэтому я не могу его воспроизвести. Процесс завершается, когда я звоню:

Код: Выделить всё

 processToExecute.destroy();
Однако задача, которую он выполняет (то есть выполнение команды), все еще активна. Странно!!!!
EDIT#02: Совместное использование основной причины
На самом деле, если я напрямую нажимаю «CTRL+C» или «q» в cmd во время работы процесса, он успешно завершает процесс, и этот процесс больше не отображается в списках выполняющихся в данный момент процессов.
И программно, когда я вызываю метод:

Код: Выделить всё

cmd> processToExecute.destroy();
Он завершает процесс, но когда я вижу список выполняющихся в данный момент процессов, я все равно вижу их там.
И тот же сценарий существует, если я попытаюсь завершить этот процесс с помощью команды «taskkill» или «kill» в другом CMD, указав их имя или pid, который все равно завершится ненормально.
P.S. Я использую следующую команду, чтобы увидеть запущенные процессы:

Код: Выделить всё

tasklist
Итак, это доказывает, что метод уничтожения() из приложения и команда «taskkill or kill» из другого CMD не завершают процесс обычно, как это происходит при нажатии «CTRL+C» и «q».>

Подробнее здесь: https://stackoverflow.com/questions/279 ... essbuilder
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»