Как запускать команды на терминале Ubuntu с помощью приложения Java. [Дубликат]

Старый код, но это то, что я использовал:

    public static IEnumerable<List<T>> InSetsOf<T>(this IEnumerable<T> source, int max)
    {
        var toReturn = new List<T>(max);
        foreach (var item in source)
        {
            toReturn.Add(item);
            if (toReturn.Count == max)
            {
                yield return toReturn;
                toReturn = new List<T>(max);
            }
        }
        if (toReturn.Any())
        {
            yield return toReturn;
        }
    }
18
задан phoenix 12 March 2013 в 10:28
поделиться

6 ответов

Не знаю почему, но почему-то версия "/ bin / bash" не работает для меня. Вместо этого более простая версия работала, следуя примеру здесь, в Oracle Docs.

String[] args = new String[] {"ping", "www.google.com"};
Process proc = new ProcessBuilder(args).start();
2
ответ дан Akash Agarwal 21 August 2018 в 23:13
поделиться

На самом деле вам не нужно запускать команду из сеанса xterm, вы можете запустить ее напрямую:

String[] arguments = new String[] {"/path/to/executable", "arg0", "arg1", "etc"};
Process proc = new ProcessBuilder(arguments).start();

Если процесс реагирует интерактивно на входной поток и вы хотите ввести значения , затем сделайте то, что вы делали раньше:

OutputStream out = proc.getOutputStream();  
out.write("command\n");  
out.flush();

Не забудьте в конце '\n', хотя большинство приложений будут использовать его для идентификации конца ввода одной команды.

8
ответ дан Chris Cooper 21 August 2018 в 23:13
поделиться
  • 1
    что здесь arg0 arg1. – Vijay 10 April 2018 в 13:00
  • 2
    Любые аргументы командной строки, которые может выполнять исполняемый файл (если есть). – Chris Cooper 12 April 2018 в 11:29

Вам нужно запустить его с помощью исполняемого файла bash следующим образом:

Runtime.getRuntime().exec("/bin/bash -c your_command");

Обновление: как предложено xav , рекомендуется использовать ProcessBuilder :

String[] args = new String[] {"/bin/bash", "-c", "your_command", "with", "args"};
Process proc = new ProcessBuilder(args).start();
26
ответ дан Community 21 August 2018 в 23:13
поделиться

Я голосую за ответ Karthik T. вам не нужно открывать терминал для запуска команд.

Например,

// file: RunShellCommandFromJava.java
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class RunShellCommandFromJava {

    public static void main(String[] args) {

        String command = "ping -c 3 www.google.com";

        Process proc = Runtime.getRuntime().exec(command);

        // Read the output

        BufferedReader reader =  
              new BufferedReader(new InputStreamReader(proc.getInputStream()));

        String line = "";
        while((line = reader.readLine()) != null) {
            System.out.print(line + "\n");
        }

        proc.waitFor();   

    }
} 

Выход:

$ javac RunShellCommandFromJava.java
$ java RunShellCommandFromJava
PING http://google.com (123.125.81.12): 56 data bytes
64 bytes from 123.125.81.12: icmp_seq=0 ttl=59 time=108.771 ms
64 bytes from 123.125.81.12: icmp_seq=1 ttl=59 time=119.601 ms
64 bytes from 123.125.81.12: icmp_seq=2 ttl=59 time=11.004 ms

--- http://google.com ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 11.004/79.792/119.601/48.841 ms
11
ответ дан pradosh nair 21 August 2018 в 23:13
поделиться
  • 1
    но если результатом выполнения команды является длинный журнал, то эта вещь readLine вообще не работает, как ее читать? – Yash Agrawal 17 March 2017 в 18:09
  • 2
    @YashAgrawal Можете ли вы предоставить команду (или аналогичную), которая генерирует длинный журнал, чтобы снова проверить эту программу? – Scott YAN 18 March 2017 в 00:32
  • 3
    Я не могу опубликовать его здесь, потому что он имеет очень длинный журнал во время выполнения команд hadoop для ex: /hadoop.../bin/hdfs jar some.jar / input / output – Yash Agrawal 18 March 2017 в 08:14
  • 4
    @YashAgrawal Я просто случайно наткнулся на то, что есть также вопрос stackoverflow.com/questions/5711084/… , который обрабатывает в основном ту же ситуацию. Я думал, что вы, возможно, захотите его проверить, можете ли вы взглянуть на него, чтобы узнать, помогает ли это? – Scott YAN 18 March 2017 в 14:40

Я знаю, что этот вопрос довольно старый, но вот библиотека , которая инкапсулирует ProcessBuilder api.

1
ответ дан UpsideDownTree 21 August 2018 в 23:13
поделиться

Как говорили другие, вы можете запускать свою внешнюю программу без xterm. Однако, если вы хотите запустить его в окне терминала, например.

xterm -e any command

В коде Java это будет:

String[] command = { "xterm", "-e", "my", "command", "with", "parameters" };
Runtime.getRuntime().exec(command);

Или, используя ProcessBuilder :

String[] command = { "xterm", "-e", "my", "command", "with", "parameters" };
Process proc = new ProcessBuilder(command).start();
5
ответ дан user1252434 21 August 2018 в 23:13
поделиться
  • 1
    Использование Runtime.exec() теперь обескуражено: вместо этого используйте ProcessBuilder ( docs.oracle.com/javase/7/docs/api/java/lang/… ) – xav 16 October 2015 в 13:40
  • 2
    Измененный вариант ProcessBuilder в. Комментарий в документации относится к ProcessBuilder, предпочитающему запускать процессы с «измененной средой», хотя и не используется в этом случае. В любом случае, основным дополнением к моему ответу является включение того, как запустить команду в xterm. – user1252434 16 October 2015 в 13:53
Другие вопросы по тегам:

Похожие вопросы: