2010-03-29 1 views
13

Aus Java, ist es möglich, die vollständige Befehlszeile mit allen Argumenten zu erhalten, die die Anwendung gestartet haben?Wie bekomme ich die Befehlszeile, die den Prozess gestartet hat?

System.getEnv() und System.getProperties() scheinen nicht die Werte zu enthalten.

+2

meinst du die Argumente für die jvm auch? Es gibt eine Frage dazu http://stackoverflow.com/questions/1490869/how-to-get-vm-arguments-from-inside-of-java-application – LB40

Antwort

12

davon einige aus der RuntimeMXBean zur Verfügung steht, durch ManagementFactory.getRuntimeMXBean() erhalten Aufruf

Sie können dann zum Beispiel

Die javadocs für die rufen sagen:

Gibt die Eingabeargumente übergeben an die Java Virtual Machine, die die Argumente für die Hauptmethode nicht enthält. Diese Methode gibt eine leere Liste zurück, wenn für die Java Virtual Machine kein Eingabeargument vorhanden ist.

Einige Java Virtual Machine Implementierungen können Eingabeargumente aus mehreren verschiedenen Quellen nehmen: Beispiele aus der Anwendung übergeben Argumente, die die Java Virtual Machine wie die ‚Java‘ Befehl, Umgebungsvariablen, Konfigurationsdateien startet usw.

In der Regel werden nicht alle Befehlszeilenoptionen für den Befehl 'java' an die Java Virtual Machine übergeben. Daher enthalten die zurückgegebenen Eingabeargumente möglicherweise nicht alle Befehlszeilenoptionen.

+2

Ich denke, das ist das Beste, was man mit reinem Java erreichen kann. – msandiford

+0

+1 Einige Beispielcode würde mir das perfekt !!! :) – OscarRyz

+0

@Stephen Denne ... Nicht ein Fan von diesem. Mein Verständnis der Frage war, die Befehlszeile zu bekommen (sagen Sie, was in 'ps -f' mit der Befehlszeichenkette angezeigt wird. Wie die Handbuchseite sagt," _ schließt die Argumente zur Hauptmethode nicht ein. _ "Gerade jetzt, ich ' Ich versuche zu bestimmen, was ein anderes Programm an eine "Hauptleitung" übergibt, die für meine Klasse nicht sichtbar ist. – will

1

In Linux/UNIX, das möglich sein soll, wenn Sie die Ausgabe dieses Befehls (lief in einer Shell) erhalten

cat /proc/$PPID/cmdline 

Aber das ist überhaupt nicht tragbar und sollte daher nicht in Java verwendet werden .. .

+0

Ok, danke. Es ist in Ordnung, wenn es nicht portabel ist, aber ich muss es auch auf Windows arbeiten. – aksamit

+2

@aksamit - mit anderen Worten, Sie müssen es zwischen (mindestens) Linux und Windows tragbar sein ... duh! @Johannes - "sollte deshalb in Java nicht verwendet werden" ist zu stark. Es ist nicht völlig falsch, nicht-portablen Code in Java zu schreiben ... wenn die Umstände es erfordern. –

+0

@Johannes Weiß: So Sun wo gerade aus dem Kopf, wenn sie sich entschieden haben, * Runtime.exec * in Ordnung zu bringen? Ich meine, es dient offensichtlich überhaupt keiner Notwendigkeit und sollte aus der Sprache entfernt werden, um den "reinen Java-Göttern" zu gefallen? Oder ? – SyntaxT3rr0r

1

Die folgenden Links helfen Sie dort ankommen kann:

How to get command line arguments for a running process

get command-line of running processes

How to get a list of current open windows/process with Java?

Nur als Anmerkung:

In Windows haben Sie Process Explorer by Sysinternals, dass Sie die Befehlszeile zeigt, verwendet, um den Prozess zu öffnen. Klicken Sie mit der rechten Maustaste auf den Prozess und wählen Sie Eigenschaften ... Sie sehen Befehlszeile in dem Fenster, das geöffnet wird.

0

Sie möchten vielleicht untersuchen, wie jps dies tut. Es ist ein Java-Programm, das in der Lage ist, die vollständige Befehlszeile für alle Java-Prozesse abzurufen, einschließlich des vollständigen Klassennamens der Hauptklasse und der JVM-Optionen.

0

Eine Option, die ich in der Vergangenheit verwendet habe, den plattformübergreifende-Glanz zu halten ist die Befehlszeile als Umgebungsvariable zu setzen, bevor Sie den Befehl zu erteilen.

1

Es gibt eine Umgebungsvariable% ~ dp0, die den vollständigen Pfad zurück

+1

Auf ... welchem ​​OS? – OscarRyz

+1

Hoppla .. Ich habe vergessen, dass es in Windows ist. Sehr nützlich, um den UNC-Pfad zu wechseln Beispiel: UNC-Pfad \\ Server \ Freigabe \ Ordner1 \ runit.bat Wenn die erste Zeile des Stapels pushd% ~ dp0 ist, wird der aktuelle Pfad \\ Server \ Freigabe \ Ordner1 \ – ggonsalv

+0

sein Antwort ist nicht relevant für, warum ich diese Frage fand, aber nützlich zu wissen. –

0

einen Blick auf YAJSW (noch anderen Java Service Wrapper) - es hat JNA-basierte Implementierungen für verschiedene Betriebssysteme (einschließlich win32 und Linux), das Tue genau das, damit es die Befehlszeile für einen laufenden Prozess erfassen und eine Konfiguration erstellen kann, die es in einen Service einbindet. Ein bisschen mehr Info here.

0

Wenn Sie Solaris als Betriebssystem verwenden, sehen Sie sich das Dienstprogramm "pargs" an. Druckt alle erforderlichen Informationen.

Verwandte Themen