使用 Java ProcessBuilder,我如何 运行 位于 unix 主目录中的进程?
Using Java ProcessBuilder, how do I run a process located in a unix home directory?
我们有一个 Java 服务器-客户端应用程序,它允许我们 运行 在不同的盒子(即客户端)上进行处理,这些盒子由 Java ProcessBuilder
.我想 运行 一个将 copied/synced 到用户主目录(即启动客户端的用户)的进程。
如何在传递给 ProcessBuilder
的 String
中引用 unix 主目录? (由于服务器-客户端应用程序的设计,只有进程的字符串、args 等传递给 ProcessBuilder。)
如果我明确说明主目录,它会起作用:
/home/user/processes/process.sh
但是,这假设我知道哪个用户在 运行 客户端。 (设计的一部分是我们可以 switch/substitute boxes/clients 到 运行 作业,而不必知道是谁在给定的盒子上启动了客户端。)
我也试过了,但是没用:
$HOME/processes/process.sh
~/processes/process.sh
我自己没有尝试过,但应该可以:
之前改成home然后执行process.sh
cd && ./processes/process.sh
问题是 ~ 和 $HOME 只能被您的 shell 理解,可能 BASH,而不被 ProcessBuilder 或 Java 理解。
$HOME 应该可以通过 属性 user.home
访问。参见 System Properties documentation
String home = System.getProperty("user.home");
即
File fullpath = new File(System.getProperty("user.home"), "processes/process.sh");
ProcessBuilder processBuilder = new ProcessBuilder(fullpath.getAbsolutePath());
或者可以相对于当前目录调用它
ProcessBuilder processBuilder = new ProcessBuilder("processes/process.sh");
processBuilder.directory(new File(System.getProperty("user.home")));
在命令行中,$HOME
和 ~
都被 shell 扩展到用户的主目录。
ProcessBuilder
直接运行进程,没有 shell,所以这些扩展将不起作用。
最后,我采用的方法是将脚本及其参数传递给 bash - 按照以下行:
ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", "$HOME/processes/process.sh args");
我们有一个 Java 服务器-客户端应用程序,它允许我们 运行 在不同的盒子(即客户端)上进行处理,这些盒子由 Java ProcessBuilder
.我想 运行 一个将 copied/synced 到用户主目录(即启动客户端的用户)的进程。
如何在传递给 ProcessBuilder
的 String
中引用 unix 主目录? (由于服务器-客户端应用程序的设计,只有进程的字符串、args 等传递给 ProcessBuilder。)
如果我明确说明主目录,它会起作用:
/home/user/processes/process.sh
但是,这假设我知道哪个用户在 运行 客户端。 (设计的一部分是我们可以 switch/substitute boxes/clients 到 运行 作业,而不必知道是谁在给定的盒子上启动了客户端。)
我也试过了,但是没用:
$HOME/processes/process.sh
~/processes/process.sh
我自己没有尝试过,但应该可以:
之前改成home然后执行process.sh
cd && ./processes/process.sh
问题是 ~ 和 $HOME 只能被您的 shell 理解,可能 BASH,而不被 ProcessBuilder 或 Java 理解。
$HOME 应该可以通过 属性 user.home
访问。参见 System Properties documentation
String home = System.getProperty("user.home");
即
File fullpath = new File(System.getProperty("user.home"), "processes/process.sh");
ProcessBuilder processBuilder = new ProcessBuilder(fullpath.getAbsolutePath());
或者可以相对于当前目录调用它
ProcessBuilder processBuilder = new ProcessBuilder("processes/process.sh");
processBuilder.directory(new File(System.getProperty("user.home")));
在命令行中,$HOME
和 ~
都被 shell 扩展到用户的主目录。
ProcessBuilder
直接运行进程,没有 shell,所以这些扩展将不起作用。
最后,我采用的方法是将脚本及其参数传递给 bash - 按照以下行:
ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", "$HOME/processes/process.sh args");