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

Forcing work directory when executing jar file in 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/ 目录。

尝试过的事情:

让这更 st运行ge 的是,如果我 cd 到 / ,然后手动执行:

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

一切都很好

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

尝试以下操作:

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

如果你在Linux之类的系统中使用&&,它将两个命令组合在一起,只有在第一个命令成功执行后,第二个命令才会被执行。所以基本上它会先更改工作目录,然后 运行 来自已更改目录的 java jar 命令,这可能会解决问题。

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

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

问题解决了!