我正在尝试为我的二进制文件运行 systemd 服务。二进制文件需要一个 --public-ip 字段的参数,我通过 提供该参数curl https://ipinfo.io/ip
。我按照以下方式操作,但可执行文件无法正确启动。
当我使用 进行检查时sudo journalctl -f
,我发现二进制文件无法看到提供给 --public-ip 选项的参数,因此它一直处于循环中并不断尝试。当我从终端调用完全相同的命令时,它似乎可以正常工作。
我在这里遗漏了什么?
我在 20.04 Ubuntu 服务器上
[Unit]
Description=test node
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=$(whoami)
ExecStart='/my/working/directory/binary --public-ip "$(curl https://ipinfo.io/ip)"'
[Install]
WantedBy=multi-user.target
答案1
systemd 自己做简约的 shell 风格命令行解析的内容ExecStart=
和其他参数。$()
不支持命令替换 ()。您需要一个实际的 shell 来处理$(curl https://ipinfo.io/ip)
。
ExecStart=/bin/sh -c 'exec /my/working/directory/binary --public-ip "$(curl https://ipinfo.io/ip)"'
笔记:
- shell 可能能够
curl
通过默认的来定位$PATH
;如果不能,则使用/full/path/to/curl
或扩展$PATH
。 - 在 shell 处理之后
$()
,它会用你对 的binary
感谢来替换自己exec
。这样你仍然可以使用Type=simple
(notType=forking
)。 - 您可能会发现
SyslogIdentifier=foo
(见这个答案)。