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/"
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=
后面