179 Stimmen

Wie führt man ein Unix-Shell-Skript aus Java-Code aus?

Es ist recht einfach, einen Unix-Befehl von Java aus auszuführen.

Runtime.getRuntime().exec(myCommand);

Aber ist es möglich, ein Unix-Shell-Skript mit Java-Code auszuführen? Wenn ja, wäre es eine gute Praxis, ein Shell-Skript aus Java-Code heraus auszuführen?

9voto

Lionel Yan Punkte 101

Hier ist mein Beispiel. Hoffe es macht Sinn.

public static void excuteCommand(String filePath) throws IOException{
    File file = new File(filePath);
    if(!file.isFile()){
        throw new IllegalArgumentException("The file " + filePath + " does not exist");
    }
    if(isLinux()){
        Runtime.getRuntime().exec(new String[] {"/bin/sh", "-c", filePath}, null);
    }else if(isWindows()){
        Runtime.getRuntime().exec("cmd /c start " + filePath);
    }
}
public static boolean isLinux(){
    String os = System.getProperty("os.name");  
    return os.toLowerCase().indexOf("linux") >= 0;
}

public static boolean isWindows(){
    String os = System.getProperty("os.name");
    return os.toLowerCase().indexOf("windows") >= 0;
}

5voto

YANKEE Punkte 59

Ja, das ist möglich und Sie haben die Frage beantwortet! Was gute Praktiken angeht, so ist es meiner Meinung nach besser, Befehle aus Dateien und nicht direkt aus Ihrem Code heraus zu starten. Sie müssen also Java dazu bringen, die Liste der Befehle (oder einen Befehl) in einer bestehenden Datei auszuführen. .bat , .sh , .ksh ... Dateien. Hier ist ein Beispiel für die Ausführung einer Liste von Befehlen in einer Datei MyFile.sh :

    String[] cmd = { "sh", "MyFile.sh", "\pathOfTheFile"};
    Runtime.getRuntime().exec(cmd);

5voto

anataliocs Punkte 9981

Um zu vermeiden, dass Sie einen absoluten Pfad eingeben müssen, können Sie die folgende Methode verwenden, die Ihr Skript findet und ausführt, wenn es sich in Ihrem Root-Verzeichnis befindet.

public static void runScript() throws IOException, InterruptedException {
    ProcessBuilder processBuilder = new ProcessBuilder("./nameOfScript.sh");
    //Sets the source and destination for subprocess standard I/O to be the same as those of the current Java process.
    processBuilder.inheritIO();
    Process process = processBuilder.start();

    int exitValue = process.waitFor();
    if (exitValue != 0) {
        // check for errors
        new BufferedInputStream(process.getErrorStream());
        throw new RuntimeException("execution of script failed!");
    }
}

3voto

Vladimir Bosyi Punkte 423

Für mich müssen alle Dinge einfach sein. Für die Ausführung des Skripts müssen Sie nur ausführen

new ProcessBuilder("pathToYourShellScript").start();

3voto

Lii Punkte 10698

El ZT Prozess Ausführender Bibliothek ist eine Alternative zu Apache Commons Exec. Sie verfügt über Funktionen zur Ausführung von Befehlen, zur Aufzeichnung ihrer Ausgabe, zur Einstellung von Timeouts usw.

Ich habe es noch nicht benutzt, aber es scheint recht gut dokumentiert zu sein.

Ein Beispiel aus der Dokumentation: Ausführen eines Befehls, Pumpen des stderr in einen Logger, Rückgabe der Ausgabe als UTF8-String.

 String output = new ProcessExecutor().command("java", "-version")
    .redirectError(Slf4jStream.of(getClass()).asInfo())
    .readOutput(true).execute()
    .outputUTF8();

In der Dokumentation werden die folgenden Vorteile gegenüber Commons Exec aufgeführt:

  • Verbesserte Handhabung von Streams
    • Lesen/Schreiben in Streams
    • Umleitung von stderr nach stdout
  • Verbesserte Behandlung von Timeouts
  • Verbesserte Überprüfung von Exit-Codes
  • Verbesserte API
    • Einzeiler für recht komplexe Anwendungsfälle
    • Einzeiler, um die Prozessausgabe in einen String zu übertragen
    • Zugang zum Prozess Objekt vorhanden
    • Unterstützung für asynchrone Prozesse ( Zukunft )
  • Verbesserte Protokollierung mit SLF4J API
  • Unterstützung für mehrere Prozesse

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X