Programm über Linux-Kommandozeile ausführen

OSchriever

Bekanntes Mitglied
Hi,
ich möchte aus meinem Programm einen Kommandozeilenbefehl auf Linux ausgeben, bekomme das aber nicht zu laufen. Ich habe das Programm auf meinem win10 geschrieben und dort getestet:

Runtime.getRuntime().exec("/bin/bash -c "C:\\Users\\Oliver Schriever\\Desktop\\Meinprogramm.jar"" );

Wie muss ich denn den Pfad unter Linux angeben, wenn sich das Programm unter home -> pi -> Desktop -> neu.jar befindet?

Danke
 
/home/pi/Desktop/neu.jar

Wobei ich da den Aufruf auch so ändern würde, so dass da java -jar mit aufgerufen wird. Dann reicht ein Java auf dem path und es muss nichts konfiguriert sein, dass er weiss, wie ein jar direkt zu starten ist...

Und die Quotes in Deinem Code sind falsch. Wenn dann hättest Du die inneren mit einem Backslash versehen müssen ...

Also sowas wie
Runtime.getRuntime().exec("/bin/bash -c java -jar /home/pi/Desktop/neu.jar" );
 
Vielen Dank, ich werde das gleich mal ausprobieren.
Weißt du auch wie ich dann ein python Programm ausführen kann? Also wenn auf dem Desktop Test.py ausgeführt werden muss?
LG
 
Du kannst die Aufrufe ja immer testen. Bei Python wird es in der Regel ein einfaches python Test.py sein.

Wenn die Shell unten drunter benötigt wird, halt ein bash -c davor. Aber das dürfte in vielen Fällen nicht notwendig sein denke ich mal ...
 
Ist nicht python datei.py für Python 2 ? Ich benutze nämlich Python 3 und rufe meine Scripts immer mit python3 datei.py auf 🙂
 
Wie muss ich denn den Pfad unter Linux angeben, wenn sich das Programm unter home -> pi -> Desktop -> neu.jar befindet?
Java:
String desktopPath = System.getProperty("user.home") + "/Desktop/";
        try {
            Runtime.getRuntime().exec("/bin/bash -c " + desktopPath + "neu.jar");
        } catch (IOException e) {
            e.printStackTrace();
        }
 
Also irgendwie scheint alles nicht zu funktionieren, wenn ich das Programm direkt aus der Console strate, dann läufts.
Hier das Java-Beispiel:
Die Anweisung
Code:
    try {
                    Runtime.getRuntime().exec("/bin/bash -c java -jar /home/pi/Desktop/Test2.jar");
                } catch (IOException ex) {
                    ex.printStackTrace();
                }

führt zu nix.
Genauso bei "Test.py"
 
Wenn ich das Terminal öffne, dann bin ich ja wieder raus aus dem Verzeichnis, oder wie soll ich das prüfen?
Kann es daran liegen, dass ich dafür so nicht die Rechte hab? Weil ich muss ja wenn ich den Befehl manuell im Terminal absetze immer noch vorher eben sudo eingeben...
 
Wenn die Applikation root Rechte braucht, dann musst du diese auch mit root Rechten starten, sonst könnte es durchaus an fehlenden Rechten liegen ...
 
Also mal zur Info: Ich hab von Linux keine Ahnung. Ob das jetzt gut oder schlecht ist weiß ich nicht. 😂
Also wenn ich direkt im Terminal das Verzeichnis auf Desktop wechsle, dann kann ich das Programm so starten. Wenn ich aber den Pfad angebe muss ich da ein sudo vor setzen.
Wenn ich aber jetzt
"/bin/bash sudo -c java -jar /home/pi/Desktop/Test2.jar"
benutze, dann läuft auch noch nix...
 
Also das klingt sehr dubios, was du da machst. Wenn es ohne sudo funktioniert, dann sollte es keine root Rechte brauchen ...

Was macht Deine Applikation, die du startest? Legt die irgendwelche Dateien oder Verzeichnisse an? Und das im Arbeitsverzeichnis? Das könnte erklären, dass es mit sudo mit Pfad aus anderen Verheichnissen funktioniert.... (und du dir ggf. dein System zugemüllt hast)

Ich würde dir empfehlen, die ein generelles Verständnis aneignen solltest, so dass du so Dinge verstehst. Sonst kommt wohl nichts so sinnvolles raus fürchte ich.

Was mir z.B. einfällt wäre sowas wie
bash -c ( cd /home/pi/desktop ; java -jar Test2.jar)
Wobei man das etwas austesten müsste ... aber etwas in der Art sollte funktionieren ...
 
Die Applikation ist nur ein kleines Python-Programm um ein Relais zu schalten. Das hat sage und schreibe 3 Zeilen Code(inklusive Import 😂) :
Code:
import piplates.RELAYplate as RELAY
RELAY.getID(0)
RELAY.relayON(0,3)

Das Beispiel mit dem .jar-Programm habe ich nur genommen, weil ich das zu Testzwecken besser kontrollieren kann, da es ne gui hat.

Ich kann die Programme doch so ausführen, weiß auch nicht was da vorhin schiefgelaufen ist.

Also ausführen per Hand kein Problem, aber über mein Programm nicht.
Da habe ich einfach nen Button, der übern Actionlistener den Befehl ausgibt.
Da gibt es auch keine Fehler im Code, habe extra noch einen Button zur Kontrolle gemacht, der mir was ausgibt. Das läuft...
 
Gib die genauen Informationen, was du exakt machst. Und zwar mit dem Python Programm. Wie startest du dieses im Terminal? Und wie startest du es in deinem Java Programm?

Irgendwas läuft da bei dir falsch. Und wenn es ohne Root Rechte funktionieren kann, dann lass sudo weg! Das ist keine Lösung, wenn du die Rechte nicht brauchst.
 
Also im Terminal gebe ich folgenden Befehl ein:
python3 /home/pi/Desktop/RELAYON.py

Und das ist der relevante Code des Programms:
Code:
public class Fenster extends JFrame {

    
    private static final long serialVersionUID = -5413214781097583793L;
    private JButton relais;

    class SchaltflaechenListener implements ActionListener {
        
        @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getActionCommand().equals("Relais")) {
                
                try {
                    Runtime.getRuntime().exec("/home/pi/Desktop/RELAYON.py");
                    
                } catch (IOException ex) {
                    ex.printStackTrace();
                    JOptionPane.showConfirmDialog(null, ex);
                }
            }
        }
    }

    public Fenster(String text) {
        super(text);
        links = new JButton("Relais");

        
        relais.addActionListener(new SchaltflaechenListener());
    
        setLayout(new BorderLayout(25, 25));
        
        setBounds(600, 500, 200, 200);
        // die Schaltflächen hinzufügen und nach Layout anordnen
        add(relais, BorderLayout.WEST);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);

    }

}
 
Dann hast du aus meiner Sicht zwei Optionen, wobei ich mit der zweiten nicht 100% sicher bin, da ich mit python nichts mache:

1) der Aufruf sollte dann auch das python3 beinhalten. Ggf incl vollem path (der wird durch which python3 angezeigt).

2) Wenn du dem Script execute Rechte gibst, dann ist es direkt ausführbar. (chmod 775 auf die Datei)
Das setzt aber neben den Rechten auf der Datei voraus, dass die erste Zeile ein #!/usr/bin/python3 oder so enthält. Das ist der Interpreter für das Script, ggf mit Optionen und so ...

Das wären die ersten Ansätze, die ich probieren würde ...
 

Neue Themen


Zurück
Oben