在Linux中启动时运行一个脚本

评论 0 浏览 0 2021-02-04

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中启动时执行脚本的不同方式。每一种方式都有它的优点和缺点,但一般来说,systemdcron应该是首选。同时,rc.localinit.d可以作为退路。

最后更新2023-01-12
0 个评论
标签