Dan*_*ter 10 bash systemd coreos
我有一个相当简单的单元文件,用于我在 CoreOS 上运行的服务器实例的发现助手服务。单元文件如下所示:
[Unit]
Description=Discovery for frontend server (instance %i)
BindsTo=frontend@%i.service
After=frontend@%i.service
[Service]
EnvironmentFile=/etc/environment
ExecStart=/usr/bin/bash -c ' \
while true; do \
export PORT=$(docker port frontend%i 80 | sed s/.*://); \
etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:$PORT" --ttl 60; \
sleep 45; \
done'
ExecStop=/usr/bin/etcdctl rm /services/frontend/%i
[X-Fleet]
MachineOf=frontend@%i.service
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我花了很长时间才到达这个阶段,因为如果我将etcdctl行更改为:
etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:${PORT}" --ttl 60; \
Run Code Online (Sandbox Code Playgroud)
然后它不起作用 - 它最终设置了一个100.45.218.3:没有端口的值。一路上,我花了很多时间玩弄$PORT变量的不同用途,但我不知道为什么我选择的配置有效。有一次我在脚本中有这个:
echo hi $PORT; \
echo "hi $PORT"; \
echo hi ${PORT}; \
echo "hi ${PORT}"; \
Run Code Online (Sandbox Code Playgroud)
并得到这样的日志日志:
Aug 17 01:05:07 core-01 bash[53694]: hi 32769
Aug 17 01:05:07 core-01 bash[53694]: hi 32769
Aug 17 01:05:07 core-01 bash[53694]: hi
Aug 17 01:05:07 core-01 bash[53694]: hi
Run Code Online (Sandbox Code Playgroud)
基本上我的问题是:这里发生了什么?这与我理解的{}在 bash 脚本中工作的方式背道而驰。为什么我可以在COREOS_PRIVATE_IPV4变量上使用卷曲(从 导出/etc/environment,但不能用于PORT?
Uwe*_*der 12
这记录在systemd.service(1) 中。${PORT}由 systemd 扩展。要将 传递$给您需要编写的外壳程序$$,因此$${PORT}. 重要的一行是这样的:
要传递文字美元符号,请使用“$$”。在扩展时值未知的变量被视为空字符串。
| 归档时间: |
|
| 查看次数: |
5010 次 |
| 最近记录: |