Java ProcessBuilder process.destroy () beendet keine untergeordneten Prozesse in winXP

9

Ich habe eine Java-App, die ProcessBuilder verwendet, um einen Betriebssystembefehl vorzubereiten, und gibt mir ein Process -Objekt. (Der eigentliche os Befehl ist rsync über ssh mit Cygwin).

Das funktioniert gut in Windows, aber wenn ich den Prozess mit process.destroy() stoppen will, wird es nicht die ssh und rsync-Prozesse des Kindes beenden ..... Ich muss sie manuell mit dem Windows Task-Manager beenden.

Ist es möglich, die OutputStream des Prozesses zu erhalten und eine ctrl-c irgendwie zu senden, bevor ich destroy(); anrufe?

Wenn jemand Ideen zu einem Workaround hat, wäre das großartig. Vielen Dank, D

    
Derek 29.04.2009, 09:33
quelle

2 Antworten

5

Ich denke auch, dass Emulation von Ctrl-C, um ssh vollständig zu töten, problematisch ist.

Was ich tun würde, ist einer der folgenden Ansätze. Entweder benutzen Sie Windows-Befehle, um herauszufinden, wer die Söhne von SSH sind (was ein wenig problematisch ist, da Sie Ihre aktuelle PID kennen müssen, um Ihre eigenen Child-Prozesse zu erhalten). Ich glaube pstools von sysinternals ist ein gutes Befehlszeilenprogramm, das aktiviert werden sollte Sie verfolgen verwaiste Prozesse. Siehe dieses Beispiel zur Steuerung von Windows-Prozessen entweder mit taskList.exe (was Ihnen helfen kann seine Ausgabe im CSV-Format BTW) oder durch Ausführen eines speziellen VBScript.

Der zweite Ansatz besteht darin, eine Java-Bibliothek wie winp zu verwenden, um den ssh-Prozess auszuführen und zu steuern. Ich glaube, du könntest alle seine Kinder auflisten und sie gewaltsam töten, wenn das Senden der richtigen Nachricht nicht ausreichen würde. Dies wäre mein bevorzugter Ansatz. Bitte beachten Sie, dass killRecursively <>> ist Methode macht genau das, was Sie wollen.

Bitte beachten Sie, dass diese Ansätze nicht nur Ihre Anwendungsfenster darstellen sollten. Sie können diese in einer Klasse kapseln, die auf Windows- und Linux-Rechnern anders läuft.

Bitte beachten Sie, dass ich nicht versucht habe, eine feinkörnige Kontrolle über Windows-Prozesse zu bekommen, also bin ich mir nicht sicher, wie ausgereift diese Lösungen sind, die ich gefunden habe.

    
Elazar Leibovich 29.04.2009, 10:22
quelle
0

Ich bin nicht sicher, was Process.destroy () unter den Abdeckungen tut (sendet ein Signal oder ähnliches?).

Was Sie vielleicht besser finden, ist, dass Sie Ihre ssh / rsync in einem Shell-Skript aufrufen und eine Prozess-ID auf stdout zurückgeben. Wenn Sie den Prozess dann beenden möchten, führen Sie /bin/kill mit dieser Prozess-ID aus . Ein bisschen unordentlich, aber vielleicht zuverlässiger.

Beachten Sie, dass Sie /bin/kill mit SIGTERM und SIGKILL können, wenn es besonders stur ist.

    
Brian Agnew 29.04.2009 09:43
quelle

Tags und Links