使用 Java ProcessBuilder,我如何 运行 位于 unix 主目录中的进程?

Using Java ProcessBuilder, how do I run a process located in a unix home directory?

我们有一个 Java 服务器-客户端应用程序,它允许我们 运行 在不同的盒子(即客户端)上进行处理,这些盒子由 Java ProcessBuilder.我想 运行 一个将 copied/synced 到用户主目录(即启动客户端的用户)的进程。

如何在传递给 ProcessBuilderString 中引用 unix 主目录? (由于服务器-客户端应用程序的设计,只有进程的字符串、args 等传递给 ProcessBuilder。)

如果我明确说明主目录,它会起作用:

但是,这假设我知道哪个用户在 运行 客户端。 (设计的一部分是我们可以 switch/substitute boxes/clients 到 运行 作业,而不必知道是谁在给定的盒子上启动了客户端。)

我也试过了,但是没用:

我自己没有尝试过,但应该可以:

之前改成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");