2015-01-14 33 views
6

Tôi đang tạo các Processes bằng cách sử dụng ProcessBuilder trong ứng dụng Java của tôi. Quá trình tạo ra thực hiện một số lệnh FFMPEG mà thực sự sao chép các luồng RTSP trong tệp phương tiện đích được chỉ định.Cách chấm dứt một quy trình Thông thường được tạo bằng ProcessBuilder

ProcessBuilder builder = new ProcessBuilder("ffmpeg", "-i", RTSP_URL, "-f", fileFormat, destFilePath); 
Process processToExecute = builder.start(); 

Tôi muốn đóng quá trình trước khi hoàn tất quá trình thực thi. Vì vậy, nếu tôi chạy lệnh FFMPEG này trực tiếp trong cửa sổ CMD và sau đó nhấn 'CTRL + C' sau 5 giây thì quá trình sẽ kết thúc với trạng thái '2'. Và tôi có thể phát tệp phương tiện được tạo cho đến giờ.

Vì vậy, Nếu tôi làm các hoạt động tương tự trong ứng dụng Java của tôi sử dụng:

process.destroy(); //I call this method after 5 sec 

tôi nhận được mã trạng thái '1' có nghĩa là chấm dứt bất thường. Tôi nhận trạng thái theo cách sau:

processToExecute.destroy(); 
processToExecute.exitValue(); //This return me status '1' 

Và tôi không thể phát tệp phương tiện và tôi nghĩ điều này là do chấm dứt bất thường của quy trình.

Vậy làm thế nào tôi có thể chấm dứt quá trình được tạo bằng cách sử dụng ProcessBuilder giống như cách chúng ta làm trong CMD với (CTRL + C) để tôi có thể phát tệp phương tiện đã tạo?

Tôi muốn chấm dứt quá trình (được tạo bằng cách sử dụng ProcessBuilder) trong ứng dụng Java với mã trạng thái '2' mà tôi nhận được khi tôi chấm dứt quá trình sử dụng CMD.

EDIT # 01: --- Sharing Kết quả

Vì vậy, khi tôi cố gắng để xóa tập tin rằng một khi ứng dụng kết thúc, tôi nhận được lỗi sau:

The Action Can't be Performed Because File is Opened in FFMPEG.exe 

Có nghĩa là quá trình không chấm dứt lệnh mà nó đang thực hiện. Lệnh đó vẫn chiếm dụng tập tin này, đó là lý do tại sao tôi không thể chơi nó. Quá trình chấm dứt khi tôi gọi:

processToExecute.destroy(); 

Tuy nhiên, nhiệm vụ đang thực hiện (đang thực thi lệnh) vẫn hoạt động. Lạ !!!!

EDIT # 02: Chia sẻ Cuối cùng lý do

Trên thực tế Nếu tôi trực tiếp bấm 'Ctrl + C' hoặc 'q' trong cmd khi quá trình đang chạy thì nó chấm dứt quá trình này thành công và quá trình này là không rõ ràng hơn trong hiện đang thực thi các danh sách quy trình.

Và Programatically khi tôi gọi phương thức:

cmd> processToExecute.destroy(); 

Nó chấm dứt quá trình này nhưng khi tôi xem danh sách các tiến trình đang thực hiện tôi vẫn có thể nhìn thấy chúng ở đó.

Và cùng một trường hợp tồn tại Nếu tôi cố gắng chấm dứt quá trình này bằng cách sử dụng lệnh 'taskkill' hoặc 'kill' trong CMD khác bằng cách chỉ định tên hoặc pid vẫn xử lý chấm dứt bất thường.

P.S.Tôi sử dụng lệnh sau để xem các tiến trình đang chạy:

tasklist 

Vì vậy, từ này nó chứng minh rằng tiêu diệt() phương pháp từ ứng dụng và 'taskkill hoặc giết' lệnh từ một CMD không chấm dứt quá trình bình thường mà nhấn 'CTRL + C 'và' q '.

+0

Tôi không biết nếu bạn có thể làm điều này trong Java, nhưng dựa trên mô tả của bạn, bạn cần gửi tín hiệu điều khiển C tới FFMPEG. Cuộc gọi API Win32 để thực hiện điều này là [GenerateConsoleCtrlEvent] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683155%28v=vs.85%29.aspx). Ngẫu nhiên, vấn đề không phải là mã trạng thái, mà chỉ là một triệu chứng khác; chấm dứt quá trình với mã trạng thái 2 là không khác nhau để chấm dứt nó với mã trạng thái 1. Bạn phải * yêu cầu * nó chấm dứt (thay vì buộc nó làm như vậy) để nó có thể chạy các thói quen dọn dẹp của nó. –

+0

Nếu đó là ffmpeg, có thể gửi cho nó một 'q' chìa khóa để nói với nó để bỏ ... – rogerdpack

+0

có Nếu tôi gửi 'q' thông qua cmd nó chấm dứt quá trình bình thường. Nhưng tôi muốn chấm dứt nó từ bên trong Ứng dụng của tôi. –

Trả lời

-2

Có thể thử ...

builder.inheritIO(); 
System.exit(2); 

Hoặc bạn có thể thử ghi vào stdin của quá trình ...

process.getInputStream().write(exitCode); 
+0

Không có phương thức 'inheritIO()' nào cho lớp 'Process' trong Java. ProcessBuilder builder = new ProcessBuilder (lệnh); Quy trình processToExecute = builder.start(); –

+0

Một lần nữa, không có phương thức 'write()' trên InputStream. Chúng ta chỉ có thể đọc từ InputStream trong khi chúng ta có thể Write trên OutputStream. Và với OutputStream Nó không có ý nghĩa gì cả. –

+0

Anh ta đã in sai, anh ta nói 'process.getOutputStream(). Write (exitCode)'. Bởi vì 'getInputStream()' trả về luồng chỉ đọc được kết nối với STDOUT của tiến trình con. Trong khi 'getOutputStream()' trả về luồng được kết nối với STDIN của tiến trình con. – Sneg

Các vấn đề liên quan