systemd 服务启动脚本在 16.04 中工作但在 18.04 中引发错误

Vio*_*ffe 8 systemd 18.04

我有以下jenkins-agent.service文件放在/etc/systemd/system/

[Unit]
Description=Jenkins agent
Requires=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/java -jar /home/jenkins/jenkins/Agent/agent.jar -jnlpUrl http://my.jenkins.server.com:8087/jenkins/computer/Ubuntu%2064-bit/slave-agent.jnlp -secret d1ac22621ad4c460e5f8de4f564345fa7cdb2bea1d26b6f17230451a37a08e7e -workDir "/home/jenkins/jenkins"
Restart=always

[Install]
Wants=network-online.target
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

它已注册systemd并完美地在系统启动时启动 Jenkins 代理进程。但是我刚刚更新到 18.04,现在这个脚本抛出了一个语法错误:

systemd-analyze verify /etc/systemd/system/jenkins-agent.service
File /lib/systemd/system/systemd-journald.service:36 configures an IP firewall (IPAddressDeny=any), but the local system does not support BPF/cgroup based firewalling.
Proceeding WITHOUT firewalling in effect! (This warning is only shown for the first loaded unit using IP firewalling.)
/etc/systemd/system/jenkins-agent.service:7: Failed to resolve unit specifiers on http://my.jenkins.sever.com:8087/jenkins/computer/Ubuntu%2064-bit/slave-agent.jnlp: Invalid slot
jenkins-agent.service: Failed to create jenkins-agent.service/start: Unit jenkins-agent.service is not loaded properly: Exec format error.
Attempted to remove disk file system, and we can't allow that.
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?我不明白出了什么问题。它说问题出在该Unit部分,所以我检查了/lib/systemd/system/network-online.target它是否存在(确实存在)。

hee*_*ayl 14

问题是%在这里使用:

.../Ubuntu%2064-bit/...
#         ^
Run Code Online (Sandbox Code Playgroud)

SystemD%用作各种内部格式说明符的关键字,并且在ExecStart(和兄弟)中,这些格式说明符可用于值的动态替换。由于它不能解释%2为适当的说明符,您将得到:

Exec format error
Run Code Online (Sandbox Code Playgroud)

你需要%用另一个来逃避%

.../Ubuntu%%2064-bit/...
Run Code Online (Sandbox Code Playgroud)