加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 这个变量如何在systemd单元文件中工作?

发布时间:2020-12-15 18:36:32 所属栏目:安全 来源:网络整理
导读:我有一个相当简单的单元文件,用于我在CoreOS上运行的服务器实例的发现sidekick服务.单元文件如下所示: [Unit]Description=Discovery for frontend server (instance %i)BindsTo=frontend@%i.serviceAfter=frontend@%i.service[Service]EnvironmentFile=/etc
我有一个相当简单的单元文件,用于我在CoreOS上运行的服务器实例的发现sidekick服务.单元文件如下所示:
[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

这很好,但是我花了很长时间才进入这个阶段,因为如果我将etcdctl行更改为:

etcdctl set /services/frontend/%i "${COREOS_PRIVATE_IPV4}:${PORT}" --ttl 60; 

然后它不起作用 – 它最终设置一个像100.45.218.3:的值,没有端口.一路上我花了很多时间玩$PORT变量的不同用法,我不知道为什么我选择的配置工作.有一次,我在剧本中有这个:

echo hi $PORT; 
echo "hi $PORT"; 
echo hi ${PORT}; 
echo "hi ${PORT}"; 

得到这样的日志日志:

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

基本上我的问题是:这里发生了什么?面对我理解{}在bash脚本中的工作方式.为什么我可以在COREOS_PRIVATE_IPV4变量上使用curlies(从/ etc / environment导出,但不是PORT?

这在 systemd.service(1)中有记录.${PORT}由systemd扩展.要将$传递给shell,您需要编写$$,所以$${PORT}.重要的是这个:

To pass a literal dollar sign,use “$$”. Variables whose value is not known at expansion time are treated as empty strings.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读