2015-01-14 10 views
6

I Prozesse erschaffe mit Process in meiner Java-Anwendung. Der erstellte Prozess führt einige FFMPEG-Befehle aus, die die RTSP-Streams tatsächlich in die angegebene Zielmediadatei kopieren.Wie ein Prozess beenden Normalerweise verwenden Erstellt Process

Ich möchte den Prozess schließen, bevor es die Ausführung abgeschlossen ist. Also, wenn ich diesen FFMPEG Befehl direkt in Windows CMD laufen und drücken Sie dann ‚STRG + C‘ nach 5 Sekunden beendet dann Prozess get mit dem Status ‚2‘. Und ich kann die Mediendatei abspielen, die bisher erstellt wurde.

Also, wenn ich die gleiche Operation in meiner Java-Anwendung zu tun mit:

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

ich den Statuscode ‚1‘, die abnormale Beendigung bedeutet. Ich erhalte den Status durch die folgende Weise:

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

Und ich kann nicht die Mediendatei spielen und ich denke, das zum Abbruch des Prozesses zurückzuführen ist.

So wie ich den Prozess beenden kann mit Process in der gleichen Art und Weise haben wir in CMD tun mit (Strg + C), so dass ich die erstellte Datei wiedergeben kann?

Ich mag Prozess beenden (mit Processbuilder erstellt) in Java Application mit dem Statuscode von ‚2‘, die ich bekomme, wenn ich Prozess mit CMD beenden.

EDIT # 01: --- Teilen Entdeckungen

Also, wenn ich versuche, die Datei zu löschen, sobald App beendet wird, ich die folgende Fehlermeldung erhalten:

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

was bedeutet, dass Prozess nicht beendet der Befehl, der ausgeführt wird. Dieser Befehl hat immer noch diese Datei belegt, deshalb bin ich nicht immer spielen können. Prozess wird beendet, wenn ich rufe:

processToExecute.destroy(); 

Aber die Aufgabe, die er ausführt (dh die Ausführung eines Befehls) noch aktiv ist. Seltsam!!!!

EDIT # 02: Teile letzter Grund

Eigentlich Wenn ich direkt ‚STRG + C‘ oder ‚q‘ in cmd drücken, wenn Prozess ausgeführt wird dann beendet sie den Prozess erfolgreich und dieser Prozess ist nicht mehr sichtbar in dem Derzeit werden Prozesslisten ausgeführt.

Und Programatically, wenn ich rufe Methode:

cmd> processToExecute.destroy(); 

Es beendet den Prozess, aber wenn ich die Liste der aktuell ausgeführten Prozesse sehen kann ich sie immer noch dort sehen.

Und das gleiche Szenario existiert Wenn ich versuche, diesen Prozess mit "taskkill" oder "kill" -Befehl in einem anderen CMD zu beenden, indem Sie ihren Namen oder pid, die noch Prozess endet abnormal.

P.S.Ich verwende den folgenden Befehl, um die laufenden Prozesse zu sehen:

tasklist 

So daraus, dass() -Methode von Anwendung erweist sich zerstören und ‚taskkill oder töten‘ Befehl von einem anderen CMD ist nicht der Prozess beendet wird normalerweise, dass durch Drücken ‚CTRL + C 'und' q 'tut es.

+0

Ich weiß nicht, zu schreiben, wenn Sie dies in Java tun, aber basierend auf Ihrer Beschreibung müssen Sie ein Control-C-Signal an FFMPEG senden. Der Aufruf der Win32-API dazu ist [GenerateConsoleCtrlEvent] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683155%28v=vs.85%29.aspx). Übrigens ist das Problem nicht der Statuscode per se, das ist nur ein weiteres Symptom; Das Beenden des Prozesses mit dem Statuscode 2 unterscheidet sich nicht von dem Beenden mit dem Statuscode 1. Sie müssen * fragen * es beenden (anstatt es dazu zu zwingen), damit es seine Bereinigungsroutinen ausführen kann. –

+0

Wenn es ffmpeg ist, vielleicht senden Sie es eine "q" -Taste, um es zu sagen, zu beenden ... – rogerdpack

+0

Ja Wenn ich 'q' über cmd senden es Prozess normal beendet. Aber ich möchte es in meiner Anwendung beenden. –

Antwort

-2

Vielleicht versuchen ...

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

Oder Sie könnten versuchen, auf die stdin des Prozesses ...

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

Es gibt keine solche Methode 'inheritIO()' für die Klasse 'Process' in Java. ProcessBuilder-Builder = neuer ProcessBuilder (Befehl); Prozess processToExecute = builder.start(); –

+0

Sehr geehrte Damen und Herren, es gibt keine 'write()' Methode für InputStream. Wir können nur von InputStream lesen, während wir auf OutputStream schreiben können. Und mit OutputStream macht es keinen Sinn. –

+0

Er druckte falsch, er nannte 'process.getOutputStream(). Write (exitCode)'. Weil 'getInputStream()' den Readonly-Stream zurückgibt, der mit dem STDOUT des Subprozesses verbunden ist. Während 'getOutputStream()' den Stream zurückgibt, der mit der STDIN des Subprozesses verbunden ist. – Sneg