Java выполнить команду linux

Содержание
  1. Как с помощью Java выполнить Shell-команду
  2. Обзор
  3. Зависимость операционной системы
  4. Ввод и вывод
  5. Runtime.exec()
  6. ProcessBuilder
  7. Заключение
  8. Русские Блоги
  9. Java-программа выполняет команды Linux
  10. Интеллектуальная рекомендация
  11. Используйте Maven для создания собственного архетипа скелета проекта (4)
  12. Станция интерпретации больших данных B пользуется популярностью среди гигантов района «призрачные животные» Цай Сюкуня.
  13. Вопрос A: Алгоритм 7-15: алгоритм кратчайшего пути Дейкстры
  14. Учебный дневник — перелистывание страниц
  15. Нулевое основание для отдыха-клиента
  16. Вам также может понравиться
  17. Подробно объясните, как новички используют sqlmap для выполнения инъекционных атак на базы данных mysql.
  18. Vue заметки сортируют, пусть вам начать с Vue.js:. 04_3 Сетевое приложение: AXIOS плюс Вью
  19. Шаблон алгоритма конной повозки
  20. 35 Line Code, чтобы получить метод исследования событий (ON)
  21. Образ докера: gitlab
  22. Как запустить команды linux в коде java?
  23. 10 ответов

Как с помощью Java выполнить Shell-команду

Обзор

В этом руководстве мы рассмотрим два способа выполнения shell -команд из программы на Java . Первый способ – использовать класс Runtime и вызвать его метод exec . Второй (более гибкий способ) – создать экземпляр класса ProcessBuilder .

Зависимость операционной системы

Сначала нужно определить операционную систему, на которой работает наша JVM . В Windows необходимо запустить команду в качестве аргумента оболочки cmd.exe, а в остальных ОС мы будем использовать стандартную оболочку sh:

Ввод и вывод

Также нужно подключиться к входным и выходным потокам нашего процесса. По крайней мере, нужно получить выходные данные, иначе процесс зависнет.

Реализуем класс StreamGobbler, который использует InputStream :

Примечание. Этот класс реализует интерфейс Runnable , а это означает, что он может быть выполнен любым исполнителем.

Runtime.exec()

Метод Runtime.exec() — это простой, но недостаточно гибкий способ создания нового подпроцесса .

В следующем примере мы запросим список пользователей из локальной директории и выведем его в консоли:

ProcessBuilder

Класс ProcessBuilder является более гибким в использовании, чем Runtime. Он позволяет настраивать целый ряд параметров.

  • изменить рабочий каталог, в котором работает shell-команда,
  • перенаправить потоки ввода и вывода;
  • наследовать их в потоках текущего процесса JVM, используя builder.inheritIO().

Заключение

Shell команды в Java можно выполнять двумя различными способами. Но если нужно настроить выполнение созданного процесса, то используйте класс ProcessBuilder .

Программные исходники примеров, приведенных в этой статье, доступны на GitHub .

Пожалуйста, оставляйте ваши мнения по текущей теме статьи. Мы крайне благодарны вам за ваши комментарии, отклики, дизлайки, подписки, лайки!

Источник

Русские Блоги

Java-программа выполняет команды Linux

Выполнение команд linux в программах Java в основном зависит от двух категорий: Process и Runtime

Сначала посмотрите на класс Process:

  1. Методы ProcessBuilder.start () и Runtime.exec создают собственный процесс и возвращают экземпляр подкласса Process.
  2. Этот экземпляр можно использовать для управления процессом и получения соответствующей информации. Категория «Процесс» обеспечивает выполнение от ввода процесса, вывод выполнения до процесса, ожидание завершения процесса,
  3. Проверьте состояние выхода процесса и как уничтожить (убить) процесс. к
  4. Метод создания процесса может не работать для определенных процессов на некоторых собственных платформах, таких как процессы собственного окна, процессы демона, Microsoft Windows
  5. Процесс Win16 / DOS или скрипт оболочки на предыдущей странице. Созданный дочерний процесс не имеет собственного терминала или консоли. Все его стандарты io (т.е. stdin, stdout и stderr)
  6. Операции будут перенаправлены в родительский процесс через три потока (getOutputStream (), getInputStream () и getErrorStream ()). к
  7. Родительский процесс использует эти потоки для предоставления входных данных дочернему процессу и получения выходных данных дочернего процесса. Поскольку некоторые собственные платформы предоставляют ограниченный размер буфера для стандартных входных и выходных потоков,
  8. Если выходной поток или входной поток дочернего процесса чтения и записи завершается неудачно, это может привести к блокировке дочернего процесса или даже к возникновению взаимоблокировки. к
  9. Когда больше нет ссылок на объект Process, вместо удаления дочернего процесса он продолжает выполнять дочерний процесс асинхронно. к
  10. Для процесса Java с объектом Process нет необходимости выполнять процесс, представленный объектом Process, асинхронно или одновременно. к
Читайте также:  Canon pixma driver windows

Особое внимание следует уделить:

1, Созданный дочерний процесс не имеет собственной терминальной консоли Все операции по маркировке будут проходить через три потока.

(getOutputStream (), getInputStream () и getErrorStream ()) перенаправляют в родительский процесс ( Родительский процесс может судить о выполнении дочернего процесса через эти потоки. )

2. Потому что Некоторые собственные платформы предоставляют ограниченный размер буфера для стандартных потоков ввода и вывода Если выходной поток или входной поток для чтения и записи дочернего процесса завершается неудачно,

Это может привести к блокировке дочернего процесса или даже к тупику

  1. abstract void destroy()
  2. Убей дочерний процесс. .
  3. abstract int exitValue()
  4. Вернуть значение экспорта дочернего процесса. По соглашению, значение 0 означает нормальное завершение. .
  5. abstract InputStream getErrorStream()
  6. Получите поток ошибок дочернего процесса. .
  7. abstract InputStream getInputStream()
  8. Получите входной поток дочернего процесса. .
  9. abstract OutputStream getOutputStream()
  10. Получите выходной поток дочернего процесса. .
  11. abstract int waitFor()
  12. Это заставляет текущий поток ждать. При необходимости он должен ждать, пока процесс, представленный объектом Process, не завершится. к
  13. Если дочерний процесс был завершен, этот метод немедленно возвращается. Если дочерний процесс не завершен, вызывающий поток будет заблокирован до завершения дочернего процесса. к

Особое внимание следует уделить: если во входном потоке, выходном потоке или потоке ошибок в дочернем процессе больше содержимого, лучше использовать кэш (Обратите внимание на ситуацию 2 выше)

Давайте снова посмотрим на класс Runtime:

  1. Каждое Java-приложение имеет экземпляр класса Runtime, который позволяет приложению подключаться к среде, в которой оно выполняется. Текущую среду выполнения можно получить с помощью метода getRuntime. .
  2. Приложение не может создать свой собственный экземпляр класса Runtime. .

Введите несколько основных методов:

  1. Process exec(String command)
  2. Выполнить указанную строковую команду в отдельном процессе. к
  3. Process exec(String command, String[] envp)
  4. Выполните указанную строковую команду в отдельном процессе в указанной среде. к
  5. Process exec(String command, String[] envp, File dir)
  6. Выполните указанную строковую команду в независимом процессе с указанной средой и рабочим каталогом. к
  7. Process exec(String[] cmdarray)
  8. Выполните назначенные команды и переменные в отдельном процессе. .
  9. Process exec(String[] cmdarray, String[] envp)
  10. Выполнять назначенные команды и переменные в независимом процессе в назначенной среде. .
  11. Process exec(String[] cmdarray, String[] envp, File dir)
  12. Выполните указанные команды и переменные в независимом процессе указанной среды и рабочего каталога. .

команда: указанная системная команда.

Читайте также:  Увеличение разделов linux консоль

envp: Строковый массив переменных среды, где форматом установки каждой переменной среды является имя = значение; если дочерний процесс должен наследовать среду текущего процесса, этот параметр имеет значение null.

dir: рабочий каталог дочернего процесса, если дочерний процесс должен наследовать рабочий каталог текущего процесса, этот параметр имеет значение null.

cmdarray: массив, содержащий вызываемые команды и их параметры.

Ниже приведен пример (его нужно пометить как исполняемый пакет jar и выбросить под linux для выполнения):

  1. public class test <
  2. public static void main(String[] args) <
  3. InputStream in = null ;
  4. try <
  5. Process pro = Runtime.getRuntime().exec( new String[] < "sh" ,
  6. «/home/test/test.sh» , «select admin from M_ADMIN» ,
  7. «/home/test/result.txt» >);
  8. pro.waitFor();
  9. in = pro.getInputStream();
  10. BufferedReader read = new BufferedReader( new InputStreamReader(in));
  11. String result = read.readLine();
  12. System.out.println( «INFO:» +result);
  13. > catch (Exception e) <
  14. e.printStackTrace();
  15. >
  16. >
  17. >

Здесь используется метод Process exec (String [] cmdarray)

Сценарий /home/test/test.sh выглядит следующим образом:

  1. #!/bin/sh
  2. #Query sql
  3. SQL=$1
  4. # Запрос сохранить файл сохранения
  5. RESULT_FILE=$2
  6. # Подключение к базе данных
  7. DB_NAME=scott
  8. DB_PWD=tiger
  9. DB_SERVER=DB_TEST
  10. RESULT=`sqlplus -S $/$@$
  11. set heading off
  12. set echo off
  13. set pages 0
  14. set feed off
  15. set linesize 3000
  16. $
  17. /
  18. commit
  19. /
  20. !`
  21. echo «$» >> $
  22. echo 0;

Особое внимание следует обратить на тот факт, что когда выполняемая команда linux имеет символ канала (например, ps -ef | grep java), описанный выше метод не будет работать. Решение состоит в том, чтобы передать команду, которая будет выполнена, в качестве параметра оболочке

  1. public class Test <
  2. public static void main(String[] args) throws Exception <
  3. String[] cmds = < "/bin/sh" , "-c" , "ps -ef|grep java" >;
  4. Process pro = Runtime.getRuntime().exec(cmds);
  5. pro.waitFor();
  6. InputStream in = pro.getInputStream();
  7. BufferedReader read = new BufferedReader( new InputStreamReader(in));
  8. String line = null ;
  9. while ((line = read.readLine())!= null ) <
  10. System.out.println(line);
  11. >
  12. >
  13. >

Runtime.getRuntime (). Exec () очень ресурсоемкий в виртуальной машине Java. Даже если команда может быть выполнена быстро, создание процесса потребляет очень объективно во время частых вызовов.

Процесс выполнения этой команды в виртуальной машине Java, прежде всего, клон Процесс, имеющий те же переменные среды, что и текущая виртуальная машина, затем использует этот новый процесс для выполнения внешних команд и, наконец, завершает процесс. Частое создание потребляет много ресурсов процессора и памяти

Интеллектуальная рекомендация

Используйте Maven для создания собственного архетипа скелета проекта (4)

Один, базовое введение в Maven Во-вторых, скачайте и настройте Maven Три, настроить домашнее зеркало на Али В-четвертых, создайте содержимое скелета архетипа В-пятых, создайте проект через архетип 6. .

Станция интерпретации больших данных B пользуется популярностью среди гигантов района «призрачные животные» Цай Сюкуня.

Автор | Сюй Линь Ответственный редактор | Ху Вэйвэй Предисловие Недавно Цай Сюкунь отправил письмо юриста на станцию ​​B. Содержание письма юриста показало, что «на станции B имеется большое кол.

Вопрос A: Алгоритм 7-15: алгоритм кратчайшего пути Дейкстры

Название Описание Во взвешенном ориентированном графе G для исходной точки v задача о кратчайшем пути от v до оставшихся вершин в G называется задачей кратчайшего пути с одной исходной точкой. Среди ш.

Учебный дневник — перелистывание страниц

Используйте плагин Layui.

Нулевое основание для отдыха-клиента

Предисловие: статья, обобщенная, когда я только что связался с тестом API, в дополнение к остальному клиенту этот инструмент сам, некоторые из мелких пониманий API, я надеюсь помочь тому же белую белу.

Вам также может понравиться

Подробно объясните, как новички используют sqlmap для выполнения инъекционных атак на базы данных mysql.

Шаг 1. Откройте для себя инъекцию Со мной все было нормально, когда я был свободен, я случайно нажал на чужой блог и обнаружил, что ссылка заканчивается на id, поэтому я проверил его вручную. Результа.

Vue заметки сортируют, пусть вам начать с Vue.js:. 04_3 Сетевое приложение: AXIOS плюс Вью

В предыдущем разделе мы ввели основное использование AXIOS, по сравнению с нативным Ajax, который при условии, что способ является более простым и, а сетевые данные теперь в состоянии получить его ров.

Шаблон алгоритма конной повозки

Блог гангстеров Тележки, запряженные лошадьми, используются для решения проблемы самой длинной подстроки палиндрома. Основное внимание уделяется подстрокам, а не подпоследовательностям. Если вы хотите.

35 Line Code, чтобы получить метод исследования событий (ON)

Об авторе: Чжу Сяою,Личный публичный номер: языковой класс большой кошки Эта проблема научит вас этой большой классе Cat.Как написать наиболее эффективное метод исследования событий с 35 Line R Code C.

Образ докера: gitlab

GitLab Docker images Both GitLab CE and EE are in Docker Hub: GitLab CE Docker image GitLab EE Docker image The GitLab Docker images are monolithic images of GitLab running all the necessary services .

Источник

Как запустить команды linux в коде java?

Я хочу создать diff из двух файлов. Я попытался найти код на Java, который это делает, но не нашел для этого простого кода/ кода утилиты. Поэтому я подумал, что если я могу каким-то образом запустить команду linux diff/sdiff из моего java-кода и заставить ее вернуть файл, в котором хранится diff, тогда было бы здорово.

предположим, что есть два файла fileA и fileB. Я должен иметь возможность хранить их diff в файле с именем fileDiff через мой java-код. Тогда извлечение данных из fileDiff не будет крупная сделка.

10 ответов

можно использовать java.lang.Runtime.exec для запуска простого кода. Это дает вам обратно Process и вы можете прочитать свой стандартный выход сразу без временно хранить выход на диске.

например, вот полная программа, которая продемонстрирует, как это сделать:

при компиляции и запуске он выводит:

как и ожидалось.

вы также можете получить поток ошибок для стандартной ошибки процесса, и выходной поток для стандартного ввода процесса, достаточно запутанно. В этом контексте входные и выходные данные реверсируются, так как это input С процесс к этому (т. е. стандарт выход процесса).

если вы хотите объединить стандартный вывод процесса и ошибку из Java (в отличие от использования 2>&1 в фактической команде), вы должны посмотреть в ProcessBuilder .

вы также можете написать файл сценария оболочки и вызвать этот файл из кода java. как показано ниже

напишите команды linux в файле сценария, как только выполнение закончится, вы можете прочитать файл diff на Java.

преимущество этого подхода заключается в том, что вы можете изменить команды без изменения кода java.

Источник

Читайте также:  Mac os and windows vmware
Оцените статью