'ip address' 命令在 Linux 中的 rc.local 中不显示 IP 地址

'ip address' 命令在 Linux 中的 rc.local 中不显示 IP 地址

我想将我的脚本添加到 etc/rc.local 文件中,以使其在机器启动时自动启动。我的脚本需要网络条件,我在运行此脚本时发现网络尚未准备好。我认为,rc.local可能启动较晚,那么网络是否应该准备好?或者如果现阶段网络不可用是正常的,我的脚本应该放在哪里?欢迎任何评论。

我的linux机器已经打开了Linux localhost.localdomain 4.18.0-147.8.1.el8_1.x86_64

rc.local中的一段代码:ip地址>>/home/user/log.boot 2>&1

log.boot如下:

eno1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
 linker/ether xxxxxx brd ff:ff:ff:ff:ff:ff

答案1

如果我没记错的话,它/etc/rc.local已被弃用。如果您需要在启动后运行命令,请使用带有@reboot特殊标记的 cron 。

创建一个新文件/etc/cron.d/并添加一个新行

@reboot ip address >> /home/user/log.boot 2>&1

下次启动时 cron 将运行ip address >> /home/user/log.boot 2>&1

答案2

运行的 systemd 服务的默认定义/etc/rc.d/rc.local(在 RHEL/CentOS/UEL 8 中符号链接/etc/rc.local)是:

[Unit]
Description=/etc/rc.d/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.d/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.d/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

请注意,指定的唯一排序依赖项是After=network.target。这没有多大意义:基本上,一旦启动就可以NetworkManager.service执行rsyslog.service。因此,在实践中,它通常在 NetworkManager 努力启动网络接口时并行运行,这对于您的特定目的来说还为时过早。

这将是编写您自己的最小 systemd 服务的一个很好的例子。

首先,systemdExecStart=不是 shell 命令行:它不支持重定向。因此,为您的命令创建一个最小的 shell 脚本,例如/usr/local/bin/log-boot-ip.sh并将其标记为可执行 ( chmod +x /usr/local/bin/log-boot-ip.sh):

#!/bin/sh
ip address >> /home/user/log.boot 2>&1

然后让我们写一个最小的/etc/systemd/system/log-boot-ip.service

[Unit]
Description=log IP address(es) at each boot
ConditionFileIsExecutable=/usr/local/bin/log-boot-ip.sh
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/local/bin/log-boot-ip.sh

[Install]
WantedBy=multi-user.target

与往常一样,添加或修改systemd服务定义后,请systemctl daemon-reload在将其log-boot-ip.service就位后运行。

  • Description:只是一个人类可读的简短描述

  • ConditionFileIsExecutable:如果我们的脚本不可执行,将无害地跳过此服务

  • WantsAfter:这是设置服务在网络接口激活后运行的方法,请参阅man systemd.special

  • Type=oneshot:因为脚本将退出而不保留任何运行。如果没有这个,systemd 会假设Type=simple脚本退出意味着它失败了。

  • RemainAfterExit=true:使 systemd “记住”该服务已经执行过一次,并将其显示为“活动”,即使脚本已退出。

  • ExecStart:指定要运行的实际命令/脚本。

  • WantedBy=multi-user.target:使服务被添加到正常的启动过程中。

相关内容