在 Linux 中启动时执行脚本
1. 概述
在这个简短的教程中,我们将介绍在 Linux 中启动时执行脚本的不同选项。这在很多情况下都派上用场,例如如果我们想自动启动服务器应用程序。
2. 解决方案
事不宜迟,让我们创建一个简单的脚本来执行:
#!/bin/sh
echo "Last reboot time: $(date)" > /etc/motd
这段代码将当天的消息设置为最后一次重新启动时间,以便每个用户在第一次登录后都可以看到它。
之后,让我们保存我们的文件并使其可执行:
$ chmod +x reboot_message.sh
现在我们的脚本已经准备好了,让我们看看如何安排它的执行。
2.1. 使用cron
让我们从最简单的解决方案开始,它涉及使用*cron 。为此,我们需要编辑crontab*文件:
$ crontab -e
在这里,我们将使用*@reboot*表达式添加一行,它将在启动时执行我们的代码:
@reboot sh /home/ec2-user/reboot_message.sh
这个解决方案既快速又干净,因为我们不必处理额外的配置,但并非每个版本的cron都支持@reboot。**
2.2. 使用rc.local
现在让我们考虑另一个利用*/etc/rc.d/rc.local*文件的解决方案。由于这个文件在启动时已经运行,我们可以附加一行来调用我们的脚本:
sh /home/ec2-user/reboot_message.sh
但是,要使其正常工作,我们需要确保rc.local文件本身是可执行的:
$ chmod +x /etc/rc.d/rc.local
2.3. 使用init.d
与之前的解决方案类似,/ etc/ init.d文件夹包含系统管理的服务的生命周期可执行文件。此外,我们可以通过创建一个符合 LSB 的 包装器来启动我们的服务来添加我们自己的包装器:
#! /bin/sh
# chkconfig: 345 99 10
case "$1" in
start)
# Executes our script
sudo sh /home/ec2-user/reboot_message.sh
;;
*)
;;
esac
exit 0
当使用start参数调用此包装器时,它将启动我们的代码。但是,我们必须在chkconfig配置中包含一行,其中包含服务运行级别 和启动/停止优先级。
将包装器放入init.d文件夹后,我们需要注册我们的服务以进行启动执行:
$ chkconfig --add service_wrapper.sh
由于chkconfig命令在 Debian 系统上不可用,因此可以使用update-rc.d作为替代:
$ update-rc.d service_wrapper.sh defaults
2.4. 使用systemd
最后,我们将了解如何使用systemd运行脚本。与init.d类似,我们需要在*/etc/systemd/system下创建一个服务描述符(称为单元文件*) :
[Unit]
Description=Reboot message systemd service.
[Service]
Type=simple
ExecStart=/bin/bash /home/ec2-user/reboot_message.sh
[Install]
WantedBy=multi-user.target
该文件分为不同的部分:
- Unit——包含一般元数据,如人类可读的描述
- Service——描述进程和守护进程,以及启动服务的命令
- Install——使服务在启动时运行,使用WantedBy中指定的文件夹来处理依赖项
最后,我们需要将文件权限设置为 644 并使用systemctl启用我们的服务:
$ chmod 644 /etc/systemd/system/reboot_message.service
$ systemctl enable reboot_message.service
要记住的一件事是,尽管许多主要发行版都支持systemd,但它并不总是可用。