Kør unix shell script, som er placeret på serveren og kortlagt som en U://dirver på windows fra Windows i java applikation?

Indlæg af Hanne Mølgaard Plasc

Problem



Når jeg kører runShellScript(unixCommand); får jeg følgende fejl: sh.exe has stoped working.
Kan nogen fortælle, hvad der er problemet, og hvordan man løser det?



#!/bin/sh
# this assumes webserver is running on port 8080
echo "Deploy everything first"
echo "These next 3 should work..."
echo "The rest of these should fail... (nicely of course)"
echo "This should work but print debug info on the client and server"
# Now undeploy everything

String unixCommand = "sh U:\home\ash\test.sh";
            try {
                runShellScript(unixCommand);
            } catch (IOException e1) {
                e1.printStackTrace();
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }



 public static void runShellScript(String unixCommand) throws IOException, InterruptedException {
    ProcessBuilder processBuilder = new ProcessBuilder("bash", "-c", unixCommand);
    processBuilder.redirectErrorStream(true);
    Process shellProcess = processBuilder.start();
    InputStream inputStream = shellProcess.getInputStream();
    int consoleDisplay;
    while ((consoleDisplay = inputStream.read()) != -1) {
        System.out.println(consoleDisplay);
    }
    try {
        inputStream.close();
    } catch (IOException iOException) {
    }
}

Bedste reference


To spørgsmål her.


For det første er det godt, at Rekin spurgte, om du bruger Cygwin, fordi det er meget relevant. Cygwin håndterer Windows-drev ved at udpege cygdrive/ og derefter drevnavnet. Det foretrækker også Unix-stil stier. Så du skal ændre din Unix-kommando til:


String unixCommand = "sh /cygdrive/u/home/ash/test.sh";


Det skal udføre dit script med succes.


Du ser dog, at output kun er tal i stedet for læselig tekst. Det er fordi i din runShellScript bruger du den laveste metode read() og læser procesudgangen en byte ad gangen og udskriver hver byte hver på sin egen adskilte linje. I det mindste bør du bruge en højere niveau strøm som DataInputStream - eller stort set enhver klasse med en read* metode, der får Strings i stedet for bytes. Endnu bedre, brug en Reader]] underklasse som BufferedReader, da dette er den moderne tilgang siden JDK 1.1. Når du har gjort det, skal du se produktionen.

Andre referencer 1


To spørgsmål her.


For det første er det godt, at Rekin spurgte, om du bruger Cygwin, fordi det er meget relevant. Cygwin håndterer Windows-drev ved at udføre cygdrive/, så drevnavnet. Det foretrækker også Unix-stil stier. Så du skal ændre din Unix-kommando til:


String unixCommand = "sh /cygdrive/u/home/ash/test.sh";


Det skal udføre dit script med succes.


Du ser dog, at output kun er tal i stedet for læselig tekst. Det er fordi i din runShellScript bruger du den laveste metode read() og læser procesudgangen en byte ad gangen og udskriver hver byte, hver på sin egen separate linje. I det mindste bør du bruge en højere niveau strøm, som DataInputStream - eller stort set enhver klasse med en read* metode, der får Strings i stedet for bytes. Endnu bedre, brug en Reader underklasse som BufferedReader, da dette er den moderne tilgang siden JDK 1.1. Når du har gjort det, skal du se output.