2015-01-14 27 views
6

kullanılarak oluşturulan bir işlemi sonlandırmak Nasıl Java Uygulamamda ProcessBuilder kullanarak işlemler oluşturuyorum. Oluşturulan işlem, RTSP akışlarını belirtilen hedef ortam dosyasında kopyalayan bazı FFMPEG komutlarını yürütür.Normalde ProcessBuilder

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

Ben onun yürütme tamamlanmasını beklemeden işlemini kapatmak istiyor. Yani, bu FFMPEG komutunu doğrudan Windows CMD'de çalıştırırsam ve daha sonra 5 saniye sonra 'CTRL + C' tuşlarına basarsam, işlem durumu '2' ile sona erer. Şimdiye kadar yaratılmış medya dosyasını oynatabilirim. Ben kullanarak benim Java Uygulamasında aynı işlemi yaparsanız

Yani,:

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

Ben durum kodu almak '1' anormal sonlandırma anlamına gelir. Ben şu arada durumu almak:

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

Ve medya dosyasını çalamaz ve bu sürecin anormal fesih nedeniyle olduğunu düşünüyorum.

Peki, ProcessBuilder kullanılarak oluşturulan işlemi, CTD'de (CTRL + C) ile yaptığımız gibi, oluşturulan ortam dosyasını oynatabileceğim şekilde nasıl sonlandırabilirim?

CMD kullanarak işlemi sonlandırdığımda aldığım "2" durum koduyla Java uygulamasında (ProcessBuilder kullanılarak oluşturulmuş) işlemi sonlandırmak istiyorum.

DÜZENLEME # 01: --- Paylaşım Bulguları

Yani, uygulama sonlandırır kez O dosyayı silmeye çalıştığınızda, aşağıdaki hatayı alıyorum:

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

işlem sonlandırma anlamına gelir Hangi Yürütme komutu. Bu komut hala bu dosyayı işgal etti, bu yüzden onu oynatamıyorum.

processToExecute.destroy(); 

Ama performansa görev (bir komutun yürütülmesi olduğunu) halen etkindir: Süreç dediğim zaman sona alır. Garip!!!!

DÜZENLEME # 02: Paylaşım Ultimate Nedeni işlemi daha sonra çalıştığı başarıyla süreci sona erer ve bu süreç içinde artık görünür olduğunda doğrudan cmd 'CTRL + C' veya 'q' basarsanız Aslında

Şu anda işlem listelerini yürütüyor.

cmd> processToExecute.destroy(); 

Bu işlemi sonlandırır ama şu anda yürütülen işlemlerin listesini gördüğümde hala orada onları görebilirsiniz:

Ve Programatically ben yöntemini çağırdığınızda. Hala işlemi anormal olarak sona onların adını veya pid belirterek başka CMD 'NotTaskkill' ya da 'öldür' komutunu kullanarak bu işlemi sonlandırmak çalışırsanız

Ve aynı senaryo bulunmaktadır.

P.S.Bundan Yani

tasklist 

o) (yok etmek Başvurusu yöntemi ve 'NotTaskkill veya öldürmek' Başka CMD komutu normalde basarak 'CTRL işlem sonlandırılıyor değil kanıtlıyor: Ben çalışan süreçleri görmek için aşağıdaki komutu kullanın + C 've' q 'yapar.

+0

Eğer Java ile bunun miyim bilmiyorum ancak açıklamanıza bağlı olarak, FFMPEG'ye bir kontrol-C sinyali göndermeniz gerekir. Bunu yapmak için Win32 API çağrısı [GenerateConsoleCtrlEvent] 'dir (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683155%28v=vs.85%29.aspx). Tesadüfen, sorun kendi başına durum kodu değil, bu sadece başka bir semptom; durum kodu 2 ile işlemin sonlandırılması, durum kodu 1 ile sonlandırılmasından farklı değildir. Temizleme yordamlarını çalıştırabilmesi için onu sonlandırmak (bunu yapmak yerine zorlamak yerine) * sormalısınız. –

+0

Eğer ffmpeg ise, belki de 'q' anahtarını göndermesini söyle ... – rogerdpack

+0

evet 'q' cmd ile gönderirsem normal olarak işlemi sonlandırır. Ama başvurumun içinden sonlandırmak istiyorum. –

cevap

-2

Belki denemek ...

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

Yoksa sürecin stdin'e yazmaya deneyebiliriz ...

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

Java'da 'Process' sınıfı için böyle bir 'inheritIO()' yöntemi yoktur. ProcessBuilder builder = new ProcessBuilder (komut); İşlem süreciToExecute = builder.start(); –

+0

Sevgili Yine, InputStream üzerinde 'write()' yöntemi yoktur. OutputStream'de Yazabilirken sadece InputStream'den okuyabiliriz. Ve OutputStream ile hiç mantıklı değil. –

+0

Yanlış yazdırılmış, process.getOutputStream() yazın. (ExitCode) 'yazın. Çünkü getInputStream() işlevi, alt işlemin STDOUT'una bağlı olarak salt akışa geri döner. GetOutputStream() işlevi, alt işlemin STDIN'ine bağlı akışı döndürür. – Sneg

İlgili konular