systemd 服务中的 ExecStart 不支持包含 * 的文件名

问题描述 投票:0回答:1

sage-server.service

[Service]

ExecStart=/usr/local/jdk-21.0.2+13/bin/java -jar /home/freedom/local/sage-app*.jar

当我运行

systemctl status sage-server
时,失败了。

错误:无法访问 jarfile /home/freedom/local/sage-app*.jar

但是我直接运行

/usr/local/jdk-21.0.2+13/bin/java -jar /home/freedom/local/sage-app*.jar
就成功了。

Linux版本:Debian 12

PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
linux shell debian systemd
1个回答
0
投票

ExecStart 不允许您使用 shell 功能...除非您 ExecStart 一个 shell。

ExecStart=/bin/sh -c '/usr/local/jdk-21.0.2+13/bin/java -jar /home/freedom/local/sage-app*.jar'

根据您的用例,如果可以的话,最好编写特定的文件名而不是通配符。但是,如果您无法控制精确的文件名,那么从某种意义上说,它是稳健的,如果有的话它会找到一个;但也很脆弱,因为如果有多个,它会找到并尝试通过所有这些,可能与您可能喜欢的顺序恰恰相反(它们按字母顺序排序,因此在许多版本编号方案中通常是最旧的第一个) .

如果您只想在最后一场比赛中通过,也许类似

for jar in /home/freedom/local/sage-app*.jar; do
    if ! [ -f "$jar" ]; then
        echo "$0: no match on $jar" >&2
        exit 123
    fi
done
exec /usr/local/jdk-21.0.2+13/bin/java "$jar"

用这么多话来说,这会循环匹配;循环结束后,最后一个将保留在循环变量中。

虽然您可以在

sh -c
中放入任意复杂的代码(如果您希望将其全部放在一行上,则需要用分号替换换行符,除了在
do
then
之后),此时最好将文件中的代码,在文件顶部添加
#!/bin/sh
shebang
chmod +x
文件,然后将文件名放在
ExecStart=

后面
© www.soinside.com 2019 - 2024. All rights reserved.