我想将我的脚本添加到 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
:如果我们的脚本不可执行,将无害地跳过此服务Wants
和After
:这是设置服务在网络接口激活后运行的方法,请参阅man systemd.special
。Type=oneshot
:因为脚本将退出而不保留任何运行。如果没有这个,systemd 会假设Type=simple
脚本退出意味着它失败了。RemainAfterExit=true
:使 systemd “记住”该服务已经执行过一次,并将其显示为“活动”,即使脚本已退出。ExecStart
:指定要运行的实际命令/脚本。WantedBy=multi-user.target
:使服务被添加到正常的启动过程中。