Runtime.getRuntime().exec()
我有一个 Java 程序,它使用以下命令在 Windows 上运行批处理文件:
cmd /C start "Title" "C:\Folder\file.bat"
Java 程序很快结束,因为cmd /C
执行命令然后终止 (1)和start "Title" "C:\Folder\file.bat"
开始批处理脚本 (2)。因此该进程(批处理文件)将继续运行独立。
现在,假设我有一个 shell 脚本(例如file.sh
),我想从 Java 启动它,它有类似的行为。它怎么可能是等效命令 (3)在 Linux 中?
笔记
- 看CMD.exe(命令 Shell)| Windows CMD | SS64.com
- 看开始 - 启动程序 | Windows CMD | SS64.com
- 标题 (
"Title"
) 不需要。
答案1
启动脚本的方法是给出其路径:
/path/to/script.sh
如果父进程退出,要让它继续运行,您可以通过附加以下内容在后台启动它&
:
/path/to/script.sh &
因此,例如,如果你有一个脚本调用另一个脚本,如下所示:
#!/bin/bash
script2.sh &
您可以运行script1.sh
它将调用script2.sh
,并且由于它被发送到后台,所以立即退出。
答案2
Linux 中执行脚本的各种方法:我的任意脚本名称是 foo.bat
例1:$bash foo.bat
示例2:$./foo.bat
例3:$echo $(~/Desktop/foo.bat)
ex4:`~/Desktop/foo.bat`
ex5:$ /path/to/shell/script/foo.bat
ex1:这只是一个普通文件,我们用 bash 执行它 ex2:我们已将 foo.bat 标记为可执行文件。($chmod +x foo.bat) ex3:命令替换 ex4:使用“``”执行 ex5:我们使用可执行文件的路径。
这些是最常见的。我会避免调用 gnome-terminal 和 xterm 之类的东西。与 bash 和 sh 之类的东西相比,这些 shell 不太常见。例如,我使用 Ubuntu mate。我既没有 xterm 也没有 gnome-terminal。但是,我有 bash 和 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 可以为您提供所需的标题功能。还有更多可能性。
答案3
据我了解,您想在 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”文件);在调用 exec 之后,它还继续以自己的方式愉快地打印 Done 消息。
如果您还想打开终端窗口,请在调用字符串前加上前缀
Runtime.getRuntime().exec(["gnome-terminal", "-e"]+args);
因此,要回答您的问题,看起来您只需调用您指定的方法即可。您是否得到了不同的行为?
答案4
你有很多选择,其中比较有趣的是:
如果是 Ubuntu,你可以使用
gnome-terminal
:gnome-terminal -c "/home/$USER/file.sh" -t "Title"
或者:
gnome-terminal -- "/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