![Java 无法在 Centos/Rocky/Fedora 上作为服务启动“无法将内存页面标记为可执行文件”](https://linux22.com/image/781802/Java%20%E6%97%A0%E6%B3%95%E5%9C%A8%20Centos%2FRocky%2FFedora%20%E4%B8%8A%E4%BD%9C%E4%B8%BA%E6%9C%8D%E5%8A%A1%E5%90%AF%E5%8A%A8%E2%80%9C%E6%97%A0%E6%B3%95%E5%B0%86%E5%86%85%E5%AD%98%E9%A1%B5%E9%9D%A2%E6%A0%87%E8%AE%B0%E4%B8%BA%E5%8F%AF%E6%89%A7%E8%A1%8C%E6%96%87%E4%BB%B6%E2%80%9D.png)
这里有一点奇怪的问题,谷歌除了这个错误消息的 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 运行该服务(尽管不应该这样做)。