我尝试使用 Java 启动一个新进程ProcessBuilder
,运行如下根用户(在原型设计阶段)。
当我使用随安装的 JDK 运行应用程序时,它可以按预期工作apt
。
我的要求是允许使用按需下载的自定义 JDK。我认为解压 JDK tar.gz 文件并将bin
文件夹中的命令标记为可执行文件就足以使这个“解压的”JDK 可用:
-rwxr-xr-x 1 root 12328 Aug 3 22:33 java
但是由于某种原因,当我使用这个“解压后的” JDKjava
命令启动同一个应用程序时:
#!/usr/bin/env sh
export APP_HOME = "/opt/path/to/app"
export JAVA_HOME = "/opt/path/to/simply/unpacked/jdk"
$JAVA_HOME/bin/java -jar $APP_HOME/app.jar
当我尝试使用 启动新进程时ProcessBuilder
,无论我尝试执行什么,都会出现以下错误(即使非常简单的命令也会失败,例如whoami
):
Caused by: java.io.IOException: Cannot run program "/usr/bin/whoami" (in directory "/opt/..."): error=13, Permission denied
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1140)
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1074)
at org.zeroturnaround.exec.ProcessExecutor.invokeStart(ProcessExecutor.java:997)
... 11 common frames omitted
Caused by: java.io.IOException: error=13, Permission denied
at java.base/java.lang.ProcessImpl.forkAndExec(Native Method)
at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:319)
at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:249)
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1111)
... 13 common frames omitted
我已经尝试了两种不同的 JDK(科雷托和神谕) 结果相同……
Kotlin 代码很简单,例如:
try {
ProcessBuilder().command("/usr/bin/whoami").inheritIO().start().waitFor()
} catch (e: Exception) {
println("whoami failed")
}
我使用 Ubuntu Server 22.04.2 LTS。
该系统是Ubuntu Server的简单默认安装,一个分区,没有网络驱动器等,
/opt
也在本地磁盘上:
$df -Th /opt/myapp/runtime
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4 98G 23G 71G 25% /
输出ls -l /usr/bin/whoami
:
$ ls -l /usr/bin/whoami
-rwxr-xr-x 1 root root 31232 Feb 7 2022 /usr/bin/whoami
附言:我是一名 Kotlin/Java 开发人员和普通 Linux 用户,Ubuntu 是我首选的开发操作系统 - 但我不是 Linux 高级用户 :)
答案1
我遇到了类似的问题,解决方案是chmod +x lib/jspawnhelper
在 JRE 文件夹中。