如何将 curl 的结果分配给 systemd 变量?

如何将 curl 的结果分配给 systemd 变量?

我正在使用 Amazon Web Service 服务器,并尝试设置一个 systemd 作业,该作业将作为输入AWS 外部 IP 检索者curl

[Unit]
Description=My example with AWS external IP
Wants=network-online.target
After=network-online.target

[Service]
Type=forking
Environment=EXTERNAL_IP=$(/usr/bin/curl http://169.254.169.254/latest/meta-data/public-ipv4)
ExecStart=/path/to/myexample $EXTERNAL_IP

[Install]
WantedBy=multi-user.target

验证工具表明环境分配systemd-analyze verify myexample.service存在问题。curl

Invalid environment assignment, ignoring: EXTERNAL_IP=$(/usr/bin/curl http://169.254.169.254/latest/meta-data/public-ipv4)

如果我curl用硬编码的 IP 字符串替换结果,我的守护进程就会启动。如何curl在 systemd 作业中使用该结果?

答案1

(首先,我假设你正在使用科特恩或其前身之一。

首先,systemd 单元不是 shell 脚本,不会被 shell 解析。这就是为什么你不能直接调用命令并将其输出用作环境变量。

然而,调用 shell来自ExecStart=,这可能是启动和运行的最快方法。

Type=simple
ExecStart=/bin/bash -c '/usr/local/bin/turnserver -X $(/usr/bin/curl http://169.254.169.254/latest/meta-data/public-ipv4)'

(在此配置中您应该不是使用 守护进程来启动 turnserver -o)

您还可以编写一个脚本,可以从 调用该脚本ExecStartPre=,它会获取您的元数据,然后改变 turnserver.conf,这会在守护进程启动之前发生。

相关内容