我正在使用 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
,这会在守护进程启动之前发生。