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

时间:2015-12-08 16:58:08

标签: java linux daemon init systemd

我正在尝试从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服务的User=root部分下添加[Service],但它没有做任何更改。无论哪种方式,只有root用户在计算机上,并且所有权限似乎都已签出。

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

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

一切都很好。

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

2 个答案:

答案 0 :(得分:23)

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

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

解决了问题!

答案 1 :(得分:-2)

请尝试以下操作:

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

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