Как запустить скрипт оболочки Unix из кода Java? - PullRequest
143 голосов
/ 08 февраля 2009

Запустить команду Unix из Java довольно просто.

Runtime.getRuntime().exec(myCommand);

Но возможно ли запустить сценарий оболочки Unix из кода Java? Если да, будет ли хорошей практикой запускать сценарий оболочки из кода Java?

Ответы [ 17 ]

2 голосов
/ 10 июля 2012

Что касается меня, все должно быть просто. Для запуска скрипта просто необходимо выполнить

new ProcessBuilder("pathToYourShellScript").start();
1 голос
/ 04 июня 2018

Это поздний ответ. Однако я подумал о том, чтобы изо всех сил пытаться заставить сценарий оболочки выполняться из приложения Spring-Boot для будущих разработчиков.

  1. Я работал в Spring-Boot и не смог найти файл, который должен быть выполнен из моего Java-приложения, и он выдавал FileNotFoundFoundException. Мне нужно было сохранить файл в каталоге resources и настроить файл для сканирования в pom.xml во время запуска приложения, как показано ниже.

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
                <include>**/*.xml</include>
                <include>**/*.properties</include>
                <include>**/*.sh</include>
            </includes>
        </resource>
    </resources>
    
  2. После этого у меня были проблемы с выполнением файла, и он возвращал error code = 13, Permission Denied. Затем мне нужно было сделать файл исполняемым, выполнив эту команду - chmod u+x myShellScript.sh

Наконец, я могу выполнить файл, используя следующий фрагмент кода.

public void runScript() {
    ProcessBuilder pb = new ProcessBuilder("src/main/resources/myFile.sh");
    try {
        Process p;
        p = pb.start();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Надеюсь, это решит чью-то проблему.

1 голос
/ 19 мая 2016
  String scriptName = PATH+"/myScript.sh";
  String commands[] = new String[]{scriptName,"myArg1", "myArg2"};

  Runtime rt = Runtime.getRuntime();
  Process process = null;
  try{
      process = rt.exec(commands);
      process.waitFor();
  }catch(Exception e){
      e.printStackTrace();
  }  
1 голос
/ 08 февраля 2009

Возможно, просто запустите его как любую другую программу. Просто убедитесь, что ваш скрипт имеет правильный #! (she-bang) в качестве первой строки сценария и убедитесь, что для файла есть разрешения на выполнение.

Например, если это скрипт bash, поместите #! / Bin / bash в начало скрипта, также chmod + x.

Кроме того, если это хорошая практика, то нет, особенно для Java, но если это сэкономит вам много времени на перенос большого скрипта, и вам не будут платить за это;) сэкономьте свое время , выполните сценарий и поместите перенос на Java в свой долгосрочный список задач.

0 голосов
/ 29 марта 2019

для использования в Linux

public static void runShell(String directory, String command, String[] args, Map<String, String> environment)
{
    try
    {
        if(directory.trim().equals(""))
            directory = "/";

        String[] cmd = new String[args.length + 1];
        cmd[0] = command;

        int count = 1;

        for(String s : args)
        {
            cmd[count] = s;
            count++;
        }

        ProcessBuilder pb = new ProcessBuilder(cmd);

        Map<String, String> env = pb.environment();

        for(String s : environment.keySet())
            env.put(s, environment.get(s));

        pb.directory(new File(directory));

        Process process = pb.start();

        BufferedReader inputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        BufferedWriter outputReader = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
        BufferedReader errReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));

        int exitValue = process.waitFor();

        if(exitValue != 0) // has errors
        {
            while(errReader.ready())
            {
                LogClass.log("ErrShell: " + errReader.readLine(), LogClass.LogMode.LogAll);
            }
        }
        else
        {
            while(inputReader.ready())
            {
                LogClass.log("Shell Result : " + inputReader.readLine(), LogClass.LogMode.LogAll);
            }
        }
    }
    catch(Exception e)
    {
        LogClass.log("Err: RunShell, " + e.toString(), LogClass.LogMode.LogAll);
    }
}

public static void runShell(String path, String command, String[] args)
{
    try
    {
        String[] cmd = new String[args.length + 1];

        if(!path.trim().isEmpty())
            cmd[0] = path + "/" + command;
        else
            cmd[0] = command;

        int count = 1;

        for(String s : args)
        {
            cmd[count] = s;
            count++;
        }

        Process process = Runtime.getRuntime().exec(cmd);

        BufferedReader inputReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        BufferedWriter outputReader = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
        BufferedReader errReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));

        int exitValue = process.waitFor();

        if(exitValue != 0) // has errors
        {
            while(errReader.ready())
            {
                LogClass.log("ErrShell: " + errReader.readLine(), LogClass.LogMode.LogAll);
            }
        }
        else
        {
            while(inputReader.ready())
            {
                LogClass.log("Shell Result: " + inputReader.readLine(), LogClass.LogMode.LogAll);
            }
        }
    }
    catch(Exception e)
    {
        LogClass.log("Err: RunShell, " + e.toString(), LogClass.LogMode.LogAll);
    }
}

и для использования;

ShellAssistance.runShell("", "pg_dump", new String[]{"-U", "aliAdmin", "-f", "/home/Backup.sql", "StoresAssistanceDB"});

OR

ShellAssistance.runShell("", "pg_dump", new String[]{"-U", "aliAdmin", "-f", "/home/Backup.sql", "StoresAssistanceDB"}, new Hashmap<>());
0 голосов
/ 10 июня 2013

Я думаю, с

System.getProperty("os.name"); 

Проверка операционной системы может управлять сценариями оболочки / bash, если таковые поддерживаются. если необходимо сделать код переносимым.

0 голосов
/ 10 октября 2009

Точно так же, как Solaris 5.10, он работает следующим образом ./batchstart.sh есть хитрость, которую я не знаю, если ваша ОС принимает ее, вместо нее используется \\. batchstart.sh. Эта двойная косая черта может помочь.

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