Запуск консольной команды из Java-кода
У меня стоит задача запустить из Java-кода вот такую команду:
winpty docker exec -it apache-mbk-corp php html/lara/artisan log:save '{...}'
Как это сделать? Не смог сообразить, как правильно это сделать с помощью класса Runtime. Пробовал написать скрипт, но тоже не сообразил как его вызвать из Java-кода.
Скрипт (script.sh):
#!C:/Program Files/Git/git-bash.exe
winpty docker exec -it apache-mbk-corp php html/lara/artisan log:save '{...}'
Пробовал вот так:
String s2 = "D:\\CORP\\auto_test\\src\\test\\java\\script.sh";
try
{
System.out.println("start");
String cmd[] = {"bash", s2};
Process proc = Runtime.getRuntime().exec(cmd);
proc.waitFor();
proc.destroy();
System.out.println("success");
}
catch (IOException | InterruptedException e)
{
e.printStackTrace();
}
При выполнении кода из контейнера с джава приложением:
try
{
System.out.println("start");
String[] command = {"bash", "pwd"};
Process proc = Runtime.getRuntime().exec(command);
System.out.write(proc.getInputStream().readAllBytes());
System.out.write(proc.getErrorStream().readAllBytes());
// Process proc = Runtime.getRuntime().exec("./tests/script.sh");
int exitCode = proc.waitFor();
System.out.println("Exit code is " + exitCode);
proc.destroy();
System.out.println("success");
}
catch (IOException | InterruptedException e)
{
e.printStackTrace();
}
System.out.println("---------------------------------");
try
{
System.out.println("start");
String[] command = {"bash", "script_linux.sh"};
Process proc = Runtime.getRuntime().exec(command);
System.out.write(proc.getInputStream().readAllBytes());
System.out.write(proc.getErrorStream().readAllBytes());
// Process proc = Runtime.getRuntime().exec("./tests/script.sh");
int exitCode = proc.waitFor();
System.out.println("Exit code is " + exitCode);
proc.destroy();
System.out.println("success");
}
catch (IOException | InterruptedException e)
{
e.printStackTrace();
}
Выдает: На первый - /bin/pwd: /bin/pwd: cannot execute binary file Exit code is 126 На второй - bash: script_linux.sh: No such file or directory Exit code is 127
Ответы (2 шт):
Предположим, вы хотите запустить команду bash script.sh:
String[] command = {"bash", "script.sh"};
Process process = Runtime.getRuntime().exec(command);
Чтобы вывести результат работы этой команды, воспользуйтесь методами getInputStream() и getErrorStream():
process.getInputStream().transferTo(System.out);
process.getErrorStream().transferTo(System.out);
(Метод transferTo доступен только с Java 9 и выше, для остальных версий Java используйте другие способы для работы с потоками данных)
Кроме этого, по окончанию работы скрипта распечатайте код возврата:
int exitCode = process.waitFor();
System.out.println("Exit code is " + exitCode);
Это даст вам больше информации о том, какие ошибки возникли при запуске скрипта.
Может кому то пригодится. По итогу я в рантайме создавал внутри php контейнера файл exec.php, который принимал на вход в качестве аргумента команду определенную в php контейнере и вызывал ее выполнение через файл artisan