ele*_*eek 12 bash systemd centos-7
我需要获取机器的 IP 并在我的服务中使用它:
[Unit]
Description=Redmine server
After=syslog.target
After=network.target
[Service]
Type=simple
User=redmine
Group=redmine
ip="$(/sbin/ip -o -4 addr list eno16777736 | awk '{print $4}' | cut -d/ -f1)"
ExecStart=/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -b $ip -p 3000
# Give a reasonable amount of time for the server to start up/shut down
TimeoutSec=300
[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
如何在systemd服务文件中执行此命令并获取其结果:
ip=$(/sbin/ip -o -4 addr list eno16777736 | awk '{print $4}' | cut -d/ -f1)
Run Code Online (Sandbox Code Playgroud)
为了使用它的结果 infor xxx.xxx.xxx.xxx,像这样:
ExecStart=/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -p 3000 -b $ip
Run Code Online (Sandbox Code Playgroud)
Gia*_*968 12
systemd.虽然我对systemd查看本教程网站以及官方systemd手册页不是很熟悉,但您似乎正在寻找一个“说明符”值:
许多设置解析说明符,这些说明符可用于编写引用运行时或单元参数的通用单元文件,这些参数在单元文件加载时被替换。
我相信在这里可以使用的特定说明符%H是“主机名”,描述为:
加载单元配置时运行系统的主机名。
因此,检查您的示例systemd脚本,将您的[Service]块更改为:
[Service]
Type=simple
User=redmine
Group=redmine
ExecStart=/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -b %H -p 3000
Run Code Online (Sandbox Code Playgroud)
请注意,带有ip=()分配的行已消失,ExecStart命令现在使用%H代替$ip。
systemd.也就是说,似乎systemd只通过%H“说明符”提供主机名。如果你问我,这很奇怪。因此,虽然我对 没有深入的经验systemd,但我相信我明白可以做些什么来实现这篇文章的目标。
关键是设置一个EnvironmentFileforsystemd阅读。阅读上如何使用的EnvironmentFile这个网站在这里。
假设您创建了一个像这样的简单 Bash 脚本;让我们命名它write_ip_to_file.sh并随意更改 IP 地址获取逻辑ip=$()以匹配您的设置:
#!/bin/bash
ip=$(/sbin/ifconfig eth0 | awk '/inet addr/ {split ($2,A,":"); print A[2]}');
echo IP=$ip > ~/ip.txt;
Run Code Online (Sandbox Code Playgroud)
所要做的就是将 的 IP 地址输出eth0到ip.txt在您的主目录中命名的文本文件。格式将是这样的:
IP=123.456.789.0
Run Code Online (Sandbox Code Playgroud)
知道了?好的。现在在您的systemd脚本中,将您的[Service]块更改为这样的;确保设置[your username]为匹配ip.txt保存目录的用户名:
[Service]
Type=simple
User=redmine
Group=redmine
EnvironmentFile=/home/[your username]/ip.txt
ExecStart=/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -b $IP -p 3000
Run Code Online (Sandbox Code Playgroud)
什么是会做的是加载在配置ip.txt和分配$IP的值123.456.789.0。我相信这就是你正在寻找的。
这里的关键因素是要write_ip_to_file.sh在启动时运行,或者甚至可以由systemd脚本本身运行。
systemd.但话虽如此,我有一个更好的主意(如果可行的话):将整个ExecStart命令移动到调用的 Bash 文件中redmine_start.sh,并确保系统可以读取和执行它。内容redmine_start.sh如下;随意更改 IP 地址获取逻辑ip=$()以匹配适用于您的设置的内容:
#!/bin/bash
ip=$(/sbin/ifconfig eth0 | awk '/inet addr/ {split ($2,A,":"); print A[2]}');
/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -b $IP -p 3000
Run Code Online (Sandbox Code Playgroud)
然后把你的[Service]块改成这样;确保设置[your username]为匹配redmine_start.sh保存目录的用户名:
[Service]
Type=simple
User=redmine
Group=redmine
ExecStart=/home/[your username]/redmine_start.sh
Run Code Online (Sandbox Code Playgroud)
如果你遵循这个逻辑,如果所有的逻辑ExecStart都包含在里面,redmine_start.sh那么你可以使用 Bash 技巧来获取 IP 地址,将它分配给一个变量,然后在那里启动 Redmine。该systemd脚本将只是管理何时/如何开始。
init.d.供init.d用户参考,我使用 Ubuntu,当我需要在 Bash 或init.d启动脚本中获取当前工作系统的 IP 地址时,我会运行如下代码:
ip=$(/sbin/ifconfig eth0 | awk '/inet addr/ {split ($2,A,":"); print A[2]}')
Run Code Online (Sandbox Code Playgroud)
当然,您需要更改/sbin/ifconfig以匹配ifconfig您系统上的位置,然后还要更改eth0以匹配您要获取其 IP 地址的网络接口。
但是一旦根据您的设置和需求进行调整,就可以成功获取接口的 IP 地址并将其分配给变量ip,然后可以像$ip在脚本中一样访问该变量。
小智 6
也许这种结构会奏效。尝试一下:
[Service]
Type=simple
User=redmine
Group=redmine
PermissionsStartOnly=true
ExecStartPre=/bin/bash -c "/bin/systemctl set-environment ip=$(/sbin/ip -o -4 addr list eno16777736 | awk '{print $4}' | cut -d/ -f1)"
ExecStart=/usr/bin/ruby /home/redmine/redmine/bin/rails server webrick -e production -b ${ip} -p 3000
Run Code Online (Sandbox Code Playgroud)
小智 6
使用主机 IP 地址和 EnvironmentFile
您可以/etc/network-environment使用setup-network-environment实用程序将主机 IP 地址写入文件。然后您可以通过以下方式运行您的应用程序:
[Unit]
Requires=setup-network-environment.service
After=setup-network-environment.service
[Service]
EnvironmentFile=/etc/network-environment
ExecStart=/opt/bin/kubelet --hostname_override=${DEFAULT_IPV4}
Run Code Online (Sandbox Code Playgroud)
来源:https : //coreos.com/os/docs/latest/using-environment-variables-in-systemd-units.html
| 归档时间: |
|
| 查看次数: |
18264 次 |
| 最近记录: |