Java threads: Ist es möglich anzeigen - /pause - /kill für einen bestimmten thread von einem anderen java-Programm läuft auf der gleichen JVM?
Ich habe ein Programm 'foo' laufen verschiedene threads, fooT1, fooT2, .. fooTn.
Nun, wenn ich möchte, schreiben Sie ein weiteres Programm, 'bar', die töten könnte den thread fooTr, ist das möglich?
Grund: der thread fooTr tracks Produkt-Lizenz. Wenn dieser thread getötet wird, kann man die Ausführung dieses Produkt auf unbestimmte Zeit. Und töten 'foo' selbst ist erträglich, wie 'foo', wie das ist genau das, was getan wird, auf Lizenz-Ablauf.
System: Fedora-Distribution des Linux -
Hinweis: Die Kommandos zum starten der JVM und das Programm foo befinden sich in /etc/init.d und wer hat anständige Kenntnisse von rc.1/rc.2/rc.3-Struktur ändern/hinzufügen der Start-Parameter für diese.
Ich hoffe meine Frage ist klar. Wenn nicht, kann ich immer Bearbeiten.
- Ähm, also, du fragst uns, wie das umgehen der Lizenzierung auf ein kommerzielles Produkt? Zweifel ist erlaubt, durch den Stackoverflow-Nutzungsbedingungen...
- ...oder möchten Sie wissen, wie zu schützen Ihr eigenes Produkt von Rissbildung?
- Sorry, für die Beantwortung so spät, ich will zu schützen, ein bestimmtes Produkt (nicht meine eigenen).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meines Wissens ist es nicht möglich, das direkt tun. Was könntest du überlegen, jedoch ist Sie eine Art von Dienst, die auf Ihrem 'foo', die aufgerufen werden kann, 'bar' zu töten, der thread. Es gibt natürlich Hunderte von Möglichkeiten, um diese umzusetzen. Mein Erster Gedanke wäre, dies zu tun mit RMI.
Eigentlich den java-debugger ermöglichen, Sie zu töten, einen Faden durch die Injektion eine Ausnahme in es. Ich habe nur versucht, herauszufinden, wie man diese Funktion nutzen, um zu töten, ein thread ohne Vernichtung der gesamten jvm, wenn stieß ich auf diese Frage. Wenn Sie in der jvm-Befehlszeile-Optionen wie:
und schließen Sie den debugger mit so etwas wie:
können Sie eingeben:
", um eine Liste der Laufenden threads, und verwenden der kill-Befehl zu töten, einen Laufenden thread. Das bit ich bin mir derzeit nicht sicher über die syntax dieser kill-Befehl, habe ich versucht das offensichtliche:
und ich bekomme die Meldungen:
("Swank REPL-Thread" ist der thread will ich töten, und ja, ich habe versucht suspendieren erste 😉
Immer noch meine Unfähigkeit, verwenden Sie den java-debugger abgesehen, sieht es für mich wie ein Roter Faden sein kann, getötet werden, ist zufällig. Vielleicht können Sie nur sicherstellen, dass Sie ignorieren alle Ausnahmen und laufen halten und das wird genug sein, aber ich bin mir nicht sicher.
Könnten Sie dies auch tun, ohne eine separate Anwendung. Schreiben Sie Ihre eigene startup-Klasse, die führt eine pass-through-Parameter auf die ursprünglichen startup-Klasse der Anwendung. Ihre Klasse ist die main-Methode obwohl schaffen würde, ein thread, der in regelmäßigen Abständen überprüft die Liste aller threads (z.B.
Thread.getAllStackTraces
oderThread.enumerate
), findet der säumige thread und ruftstop()
auf Sie. ObwohlThread.stop
ist veraltet, es funktioniert immer noch.Eine weitere option ist das ausführen der Anwendung unter einem Java-debugger sagen,
jdb
und dann aussetzen/töten die benötigten Threads. Man könnte auch den Parameter hinzufügen, um die Anwendung zu starten, so dass der JVM zugeordnet werden kann, befestigen Sie dannjdb
auf der JVM ausgeführt und vermute/kill den thread.Bis jetzt nicht möglich zu laufen, um zu verschiedenen Programmen in der gleichen JVM, aber einige Leute sind zu untersuchen, um zu reduzieren die Start-Zeit und der Speicher-und cpu-Nutzung der verschiedenen java-Programme im Einsatz in der gleichen Maschine