Java 无法在 Centos/Rocky/Fedora 上作为服务启动“无法将内存页面标记为可执行文件”

Java 无法在 Centos/Rocky/Fedora 上作为服务启动“无法将内存页面标记为可执行文件”

这里有一点奇怪的问题,谷歌除了这个错误消息的 JVM 源代码之外没有找到任何结果。

我有一个简单的 Spring Boot fat jar,myapp.jar我正在尝试将其作为 systemd 服务运行。

我已经创建了一个用户来运行此服务useradd --system --no-create-home --shell=/sbin/nologin myapp

首先,如果我尝试通过 shell 运行此应用程序,则sudo -u myapp java -jar myapp.jar该应用程序将按预期启动并运行。

但是,使用以下服务文件

 [Unit]
 Description=MyApp Service
 [Service]
 Type=simple
 WorkingDirectory=/opt/myapp
 ExecStart=/usr/bin/java -jar myapp.jar
 SuccessExitStatus=143
 User=myapp
 Group=myapp
 [Install]
 WantedBy=multi-user.target

服务启动后,将失败,日志中出现以下错误

Nov 09 17:22:24 fedora systemd[1]: Started myapp.service - MyApp Service.
Nov 09 17:22:24 fedora java[1279]: Error occurred during initialization of VM
Nov 09 17:22:24 fedora java[1279]: Failed to mark memory page as executable - check if grsecurity/PaX is enabled

我在 Centos、Rocky 和 ​​Fedora 发行版中尝试过完全相同的操作,但都出现相同的错误。

这些只是从各个发行版网站下载的 ISO 启动的 vanilla 服务器,因此没有应用任何 grsecurity/PaX 补丁。

答案1

调查表明,该问题仅在 Temurin 的各种操作系统上存在。

安装默认存储库中提供的 JRE 不会出现问题。据我所知,这是因为这些 JRE 安装在 SELinux 允许的位置,而 Temurin 则将自身安装在默认 SELinux 策略不允许的目录中。

我可以以我的用户身份运行该应用程序,因为与从 systemd 中的 ExecStart 运行相比,策略更加宽松。

禁用 SELinux 也允许 Temurin 运行该服务(尽管不应该这样做)。

相关内容