запустить сценарий оболочки Unix, который расположен на сервере и отображается как U: // dirver на окнах из окон в Java-приложении? - PullRequest
1 голос
/ 24 февраля 2012

Когда я запускаю runShellScript(unixCommand); я получаю следующую ошибку: sh.exe has stoped working. Может кто-нибудь сказать, в чем проблема и как ее решить?

#!/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) {
    }
}

Ответы [ 2 ]

1 голос
/ 16 мая 2012

Два вопроса здесь.

Во-первых, хорошо, что Рекин спросил, используете ли вы Cygwin, потому что это очень актуально. Cygwin обрабатывает диски Windows, добавляя перед cygdrive /, а затем имя диска. Он также предпочитает пути в стиле Unix. Поэтому вы должны изменить свою команду Unix на:

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

Это должно успешно выполнить ваш скрипт.

Однако затем вы увидите, что на выходе будут просто цифры, а не разборчивый текст. Это потому, что в вашем runShellScript вы используете метод read() самого низкого уровня и читаете выходные данные процесса по одному байту за раз, затем печатаете каждый байт, каждый на отдельной отдельной строке. По крайней мере, вы должны использовать поток более высокого уровня, например DataInputStream - или в основном любой класс с read* -методом, получающим Strings вместо bytes. Более того, используйте подкласс Reader, такой как BufferedReader, поскольку это современный подход со времен JDK 1.1. Как только вы это сделаете, вы должны увидеть результат.

1 голос
/ 24 февраля 2012

Два вопроса здесь.

Во-первых, хорошо, что Rekin спросил, используете ли вы Cygwin, потому что это очень актуально. Cygwin обрабатывает диски Windows, добавляя cygdrive/, а затем имя диска. Он также предпочитает пути в стиле Unix. Поэтому вы должны изменить свою команду Unix на:

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

Это должно успешно выполнить ваш скрипт.

Однако затем вы увидите, что на выходе будут просто цифры вместо любого разборчивого текста. Это потому, что в вашем runShellScript вы используете метод read() самого низкого уровня и читаете выходные данные процесса по одному байту за раз, затем печатаете каждый байт, каждый на отдельной отдельной строке. По крайней мере, вы должны использовать поток более высокого уровня, например DataInputStream - или, в основном, любой класс с методом read*, получающим Strings вместо байтов. Более того, используйте подкласс Reader, такой как BufferedReader, поскольку это современный подход со времен JDK 1.1. Как только вы это сделаете, вы должны увидеть результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...