Como finalizar um processo normalmente criado usando o ProcessBuilder
Estou criando processos usando ProcessBuilder no meu aplicativo Java. O processo criado executa alguns comandos FFMPEG que realmente copiam os fluxos RTSP no arquivo de mídia de destino especificado.
ProcessBuilder builder = new ProcessBuilder("ffmpeg", "-i", RTSP_URL, "-f", fileFormat, destFilePath);
Process processToExecute = builder.start();
Quero fechar o processo antes de concluir sua execução. Portanto, se eu executar esse comando FFMPEG diretamente no Windows CMD e pressionar 'CTRL + C' após 5 segundos, o processo get termina com o status '2'. E eu posso reproduzir o arquivo de mídia criado até agora.
Portanto, se eu fizer a mesma operação no meu aplicativo Java usando:
process.destroy(); //I call this method after 5 sec
Recebo o código de status '1', que significa encerramento anormal. Eu recebo o status da seguinte maneira:
processToExecute.destroy();
processToExecute.exitValue(); //This return me status '1'
E não consigo reproduzir o arquivo de mídia e acho que isso se deve ao encerramento anormal do processo.
Então, como posso finalizar o processo criado usando ProcessBuilder da mesma maneira que fazemos no CMD com (CTRL + C) para poder reproduzir o arquivo de mídia criado?
Desejo encerrar o processo (criado usando ProcessBuilder) no aplicativo Java com o código de status '2' que recebo quando encerro o processo usando o CMD.
EDIT # 01: --- Compartilhar conclusõesPortanto, quando tento excluir esse arquivo quando o aplicativo termina, recebo o seguinte erro:
The Action Can't be Performed Because File is Opened in FFMPEG.exe
O que significa que o processo não está finalizando o comando que está sendo executado. Esse comando ainda ocupou esse arquivo e é por isso que não estou conseguindo reproduzi-lo. O processo é encerrado quando ligo para:
processToExecute.destroy();
Porém, a tarefa que está executando (ou seja, a execução de um comando) ainda está ativa. Estranho!!!!
EDIT # 02: Compartilhando a razão finalNa verdade, se eu pressionar diretamente 'CTRL + C' ou 'q' no cmd quando o processo estiver em execução, ele encerrará o processo com êxito e esse processo não será mais visível nas listas de processos em execução no momento.
E programaticamente quando eu chamo método:
cmd> processToExecute.destroy();
Ele finaliza o processo, mas quando vejo a lista de processos em execução no momento, ainda os vejo por lá.
E o mesmo cenário existe Se eu tentar finalizar esse processo usando o comando 'taskkill' ou 'kill' em outro CMD, especificando o nome ou o pid do seu processo ainda finalizado de forma anormal.
P.S. Eu uso o seguinte comando para ver os processos em execução:
tasklist
Portanto, isso prova que o método destroy () do Aplicativo e o comando 'taskkill or kill' de outro CMD não estão encerrando o processo normalmente, ao pressionar 'CTRL + C' e 'q'.