在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-compliant包装器来添加我们自己的服务。
#! /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,但它并不总是可用的。
3.总结
在这篇文章中,我们看了Linux中启动时执行脚本的不同方式。每一种方式都有它的优点和缺点,但一般来说,systemd和cron应该是首选。同时,rc.local和init.d可以作为退路。