У меня есть Java-программа, которая запускает пакетный файл в Windows с помощью Runtime.getRuntime().exec()
с помощью следующей команды:
cmd /C start "Title" "C:\Folder\file.bat"
Java-программа быстро завершается, поскольку cmd /C
выполняет команда и затем завершается (1) sup> и start "Title" "C:\Folder\file.bat"
запускает пакетный скрипт (2) SUP>. Таким образом, процесс (командный файл) будет продолжать работать независимо .
Теперь предположим, что у меня есть сценарий оболочки (например, file.sh
), который я хочу запустить из Java и который работает аналогично. Как это может быть эквивалентная команда (3) sup> в Linux?
Заметки
"Title"
) не обязательно. У Вас есть много опций, более интересные являются ими:
, Если это для Ubuntu, можно использовать gnome-terminal
:
gnome-terminal -c "/home/$USER/file.sh" -t "Title"
, Если, Вы хотите сделать его совместимым с большей частью Linux, можно использовать xterm
:
xterm -T "Title" -e "/home/$USER/file.sh"
путь /home/$USER/file.sh
(эквивалентный Windows 7: C:\Users\%UserProfile%\file.bat
)
Эти file.sh
содержание может быть чем-то вроде этого:
#!/bin/bash
echo "In a World without Walls nor Fences, the people don't need Windows and Gates"
sleep 2
Способ запустить сценарий состоит в том, чтобы дать свой путь:
/path/to/script.sh
Для имения его продолжаются, если родительский процесс выходит, можно просто запустить его в фоновом режиме путем добавления &
:
/path/to/script.sh &
Так, если у Вас есть, например, один сценарий, называя другого как так:
#!/bin/bash
script2.sh &
Вы могли работать script1.sh
, который будет звонить script2.sh
и, потому что это отправляется в фон, выйдите сразу.
Различные способы выполнить сценарий в Linux: моим произвольным названием сценария является foo.bat
ex1:$bash foo.bat
ex2:$./foo.bat
ex3:$echo $(~/Desktop/foo.bat)
ex4: '~/Desktop/foo.bat'
ex5: $ /path/to/shell/script/foo.bat
ex1: this is is just a regular file at this point, we execute it with bash ex2: we have marked foo.bat as executable. ($chmod +x foo.bat) ex3: Command substitution ex4: execute using "``" ex5: we us the path to the executable.
Они наиболее распространены. Я постарался бы не называть вещи как терминал гнома и xterm. Это менее общие оболочки по сравнению с вещами как удар и sh. Например, я использую помощника Ubuntu. У меня нет ни xterm, ни терминала гнома. Но, у меня действительно есть удар и sh., как делает почти когда-либо другого человека, запускающего Linux / Mac OSX.
Можно ценить это учебное руководство на выполнении сценария здесь
сценарий foo.bat делает это:
$ ./foo.bat
Having a bash ./foo.bat
где его содержание:
$ cat foo.bat
#!/bin/bash
echo -e "Having a bash" $0
Я думаю, что использование 0$ может дать Вам функциональность заголовка, которой можно требовать. Существует намного больше возможностей.
Как я понимаю, Вы хотите выполнить внешнюю команду из Java, и иметь процесс Java продолжаются (асинхронно), пока та внешняя команда продолжает работать также?
Вот немного теста, который я сделал на скорую руку:
[tai@flenux runproc ] $ ls
filecreator.sh ProcRunner.class ProcRunner.java
[tai@flenux runproc ] $ cat filecreator.sh
touch newfile
[tai@flenux runproc ] $ cat ProcRunner.java
public class ProcRunner {
public static void main(String[] args) {
try {
Runtime.getRuntime().exec(args);
Thread.sleep(2000);
System.out.println("Done");
} catch(Exception e) {
System.err.println(e.toString() );
}
}
}
[tai@flenux runproc ] $ java ProcRunner bash filecreator.sh
Done
[tai@flenux runproc ] $ ls
filecreator.sh newfile ProcRunner.class ProcRunner.java
[tai@flenux runproc ] $
Java успешно должностные лица программа (который просто создает "newfile" файл); это также продолжает свой собственный веселый способ распечатать Сделанное сообщение после вызова должностного лица.
, Если Вы хотели, чтобы окно терминала открылось также, снабдите префиксом строку вызова
Runtime.getRuntime().exec(["gnome-terminal", "-e"]+args);
Так для ответа на вопрос, похоже, что Вы просто назвали бы метод, который Вы указали. Вы получаете другое поведение?