Betreibssystem Aufrufe (Unix) unklares Verhalten

takidoso

Erfahrenes Mitglied
Hallo und Halli,
kann sein, das es sich hier um ein reines OS-Problem handelt, aber es passiert in Verbindung mit Java.
in einer Anwendung wreden mittels OS-Calls Gastanwendungen gestartet, was auch eigentlich prima funktioniert. Nun kommt es aber vor, das einige Gastanwendungen gerne in ihrem Anwendungsverzeichnis laufen wollen, also der aktuelle Pfad auf diese Verzeichnisse zeigt.

in einigen privatn Tests funktioniert das ganz gut, indem man dem Aufrufstring noch ein cd mitgibt getrennt mit Semikolon und dann den eigetnlichen Startbefehl der gewünschten Anwendung.
Beispiel
Code:
cd /MeinePfadangabe/; meineAnwendung parm1 parm2
;

in der eigetnlichen Umgebung und damit unter einem anderen User bekomme ich
/usr/bin/cd[8]: cd: bad argument count
zurück, was ich eigetnlich kaum glauben kann.
Irgendwie scheint es so zu sein, dass das semikolon nicht erkannt wird oder nicht als Delimiter gilt.
Ich hatte jedoch beim Aufrufen sowohl von der bash als auch von der ksh direkt an einer Konsole keine solche Fehlermeldung.

hat jemand eine Idee wie ich da weiterkommen kann?
Gibt es vielleicht bei noch weiteren Shells andere Delimiter die zwischen den Befehlen gelten?

bin für jeden Rat dankbar

Takidoso
 
Ich hatte es zwischenzeitlich auch mit dem && ausprobiert, was mit der Konsole toll geht aber leider nicht mit dem OS-Call :(
Hat jemand vielleicht eine Ahnung von wo sich Java die entsprechende Shell holt, die aufzurufen ist?
Sieht so aus für den erssten Moment als sei dies User-Einstellungsanglegenheit.

Gibt es da irgendeine Doku oder sonstige Hinweise?

mit fragenden Grüßen

Takidoso
 
Hallo Tom,
Danke für den Link. Ist aber nicht ganz das was ich suche.
denn mir geht es nur darum zu verstehen, warum in der einen Umgebung die verschiedenen Befehle offenbar mit ; oder auch && getrennt in einen Call genommen werden können und in einer anderen Umgebung nicht. Als ob die Shell nicht gleich seien die da für den OS-Call verwendet werden gleich sind.
 
Hallo Tom,
Danke für den Link. Ist aber nicht ganz das was ich suche.
denn mir geht es nur darum zu verstehen, warum in der einen Umgebung die verschiedenen Befehle offenbar mit ; oder auch && getrennt in einen Call genommen werden können und in einer anderen Umgebung nicht. Als ob die Shell nicht gleich seien die da für den OS-Call verwendet werden gleich sind.

Du meinst: Warum kann ich das aus der Shell machen aber aus Java nicht?

Java macht einen syscall um das Programm zu starten. Dabei wird der gesamte String als Aufruf (Pfad und Name) genommen. Ein solchen Programm gibt es aber nicht!

Wenn Du das in der Shell machst, wird die Eingabezeile erst von der Shell zerlegt und interpertiert. cd ist schon mal ein internes Shell Kommando. Dann erfolgt der syscall dem evtl noch Parameter übergeben werden.


#> cd /tmp;/usr/bin/firefox http://www.goole.de

müßte in java etwa so aussehen:

ProcessBuilder builder = new ProcessBuilder( "/usr/bin/firefox", "www.google.de" );
builder.directory( new File("/tmp") );
builder.start();

Das macht die Shell vom Prinzip auch so.


Oder um näher an deinem Aufruf zu bleiben:

ProcessBuilder builder = new ProcessBuilder( "/bin/sh", "cd /tmp;/usr/bin/firefox www.goole.de" ).start();

Hier wird der String auch wieder von der Shell zerlegt.
Klar soweit? :)
 
Zuletzt bearbeitet:
Hallo die-moesch,

Du meinst: Warum kann ich das aus der Shell machen aber aus Java nicht?

naja fast....
Ich hatte auch im Internet gelesen, dass Java irgendwie nicht wirklich eine Shell verwendet oder so ähnlich. Das zeigen ja deine weiteren Ausführungen ebenso.

Doch die Frage, die mich mir stellt ist, warum in aller Welt es auf dem einen System mit User X geht
(die Sache mit dem "cd meinpfad; meinprogramm parm1 parm2")
und in einem anderen System mit einem anderen User Y das ganz offenbar nicht gescheit interpretiert wird. Da bekam ich ja den Fehler von cd
/usr/bin/cd[8]: cd: bad argument count


Als wäre da doch noch irgendwie etwas in Java was auf die Unix-Umgebung reagiert. was auch immer das dann sein mag (User oder OS oder gar beides)

Leider habe ich bisher noch nicht die Gelegenheit gehabt mit dem User X auf dem anderen System dieselbe Sache zu probieren. Werde ich aber alsbald nachholen und mal hier die groben Ergebnisse posten.


Java macht einen syscall um das Programm zu starten. Dabei wird der gesamte String als Aufruf (Pfad und Name) genommen. Ein solchen Programm gibt es aber nicht!

Wenn Du das in der Shell machst, wird die Eingabezeile erst von der Shell zerlegt und interpertiert. cd ist schon mal ein internes Shell Kommando. Dann erfolgt der syscall dem evtl noch Parameter übergeben werden.

#> cd /tmp;/usr/bin/firefox http://www.goole.de

müßte in java etwa so aussehen:

ProcessBuilder builder = new ProcessBuilder( "/usr/bin/firefox", "www.google.de" );
builder.directory( new File("/tmp") );
builder.start();

ja genau das mache ich eigentlich auch so
Java:
...
            String [] toks = applCall.split(" ");
            for (String tok :toks)
            {
                System.out.println("'"+tok+"'");
            }

            ProcessBuilder pb   = new ProcessBuilder(toks);
            File           wDir = new File(m_config.getWorkingDir());
            FileUtils.ensureDirectory(wDir, true, true, true);
            pb.directory(wDir);
            Process p = pb.start();
...
Ich habe zwar mittlerweile das mit dem aktuellen Verzeichnis, wie man hier sieht, programmatisch gelöst, aber das Rätsel, warum es in dem einen Szenario (Umgebung) so läuft und warum nicht auch in dem anderen, ist für mich noch nicht so richtig gelöst.

Aber danke für die Ausführungen

Takidoso
 

Neue Beiträge

Zurück