这里有一点奇怪的问题,谷歌除了这个错误消息的 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 运行该服务(尽管不应该这样做)。