为 systemd 二进制文件提供参数

为 systemd 二进制文件提供参数

我正在尝试为我的二进制文件运行 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(not Type=forking)。
  • 您可能会发现SyslogIdentifier=foo(见这个答案)。

相关内容