在systemd中执行jar文件时强制工作目录



我正试图在linux中从systemd服务启动一个jar。我正在执行的jar假定在当前目录中有一个xml文件。我用-config参数传递该文件的名称。我创建的示例服务如下:

[Unit] Description=my service After=network.target

[Service] Type=simple Environment="xml_file_name=sample.xml" ExecStart=/usr/bin/java -jar /path/to/jar/myapp.jar -config ${xml_file_name}

上面的服务文件放在/usr/lib/systemd/system目录中,名为myservice.service

systemctl daemon-reload systemctl stop myservice.service systemctl start myservice.service systemctl status myservice.service

systemctl status myservice.service命令显示jar文件已运行,但我的应用程序表示找不到${xml_file_name}。

此外,我的jar声明它是从/目录执行的。我认为这是问题的一部分,因为${xml_file_name}只适用于/path/to/jar/目录。

尝试过的事情:

  • -Xbootclasspath/p:"/path/to/jar/":准备jar的路径位置,以便可以看到${xml_file_name}。

  • 将/path/更改为/jar/以确保启用了所有可能的权限

  • 我试图在systemd服务的[Service]部分下添加User=root,但没有更改。无论哪种方式,只有根用户在机器上,并且权限似乎都已签出。

更奇怪的是,如果我cd到/,然后手动执行:

/usr/bin/java -jar /path/to/jar/myapp.jar -config sample.xml

一切都很好。

有什么明显的东西我在这里失踪了吗?是否可以告诉systemd服务,执行这个java jar,但确保工作路径是/path/to/jar/而不是/

为了解决这个问题,我最终在[Service]部分下使用了以下属性:

[Service] ... WorkingDirectory=/path/to/jar ExecStart=/usr/bin/java -jar my.jar -config sample.xml

解决了问题!

尝试以下操作:

 cd /path/to/jar && /usr/bin/java -jar /path/to/jar/myapp.jar -config sample.xml

如果您使用&在类似Linux的系统中,它将两个命令组合在一起,第二个命令只有在第一个命令成功执行后才能执行。因此,基本上它会首先更改工作目录,然后从更改后的目录运行javajar命令,这本可以解决问题。