详解如何在Linux上仅在首次启动时运行脚本 (5种方法任选)

1,128 阅读5分钟

乌班图8

在本文中,我们将讨论如何在 Linux 上仅在首次启动时运行脚本的各种方法。当您想要在系统首次启动后自动执行某些任务(例如软件更新、系统配置或应用程序安装)时,这尤其有用。

要仅在 Linux 上首次启动时运行脚本,您可以使用多种方法。这些包括将脚本放在/etc/init.d/目录中并在执行后将其删除,将脚本添加到/etc/rc.local文件中并在运行后将其注释掉,cloud-init在启动实例时将脚本包含在“用户数据”部分中,创建要运行的systemd服务第一次启动时执行脚本,或者使用跟踪文件检查脚本是否已经运行。

  1. Method 1: Using /etc/init.d/
  2. Method 2: Using /etc/rc.local
  3. Method 3: Using cloud-init
  4. Method 4: Using systemd
  5. Method 5: Using a Tracking File

方法1:使用/etc/init.d/

/etc/init.d/目录包含在系统启动过程中运行的脚本。要仅在第一次启动时运行脚本,您可以将脚本放在此目录中,并在脚本末尾添加一行以在执行后删除自身。

这是一个简单的例子:

#!/bin/bash
# Your commands here
rm -- "$0"

rm -- "$0"命令在运行后删除脚本,确保它仅在第一次启动时执行。

方法2:使用/etc/rc.local

/etc/rc.local文件是您可以添加脚本以在启动时运行的另一个位置。但是,它会在每次启动时运行,而不仅仅是第一次。要使其仅在第一次启动时运行,您可以在脚本末尾添加一行以在 rc.local 文件中注释掉自身。

这是一个例子:

#!/bin/bash
# Your commands here
sed -i 's/^command/#command/' /etc/rc.local

sed -i 's/^command/#command/' /etc/rc.local命令在运行后注释掉 rc.local 文件中的脚本,确保它仅在第一次启动时执行。

方法三:使用cloud-init

对于 EC2 实例来说,cloud-init是一个功能强大的工具,可以在系统启动过程的各个阶段运行命令。当您启动实例时,您可以将脚本包含在“用户数据”部分中。

以下是将脚本添加到用户数据的方法:

  1. 在 EC2 启动实例向导中的“配置实例详细信息”步骤中,展开“高级详细信息”部分。
  2. 在“用户数据”字段中,输入您的脚本。
  3. 启动实例。

“用户数据”字段中的脚本仅在第一次启动时运行。

方法4:使用systemd

Systemd 是 Linux 的系统和服务管理器。您可以创建一个在首次启动时运行脚本的 systemd 服务。

创建 systemd 服务的方法如下:

  1. 例如,创建一个脚本文件,/usr/local/bin/firstboot.sh并将命令添加到其中。
  2. 创建一个 systemd 服务文件,例如/etc/systemd/system/firstboot.service包含以下内容:
[Unit]
Description=My First Boot Script
After=network.target

[Service]
ExecStart=/usr/local/bin/firstboot.sh
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

3. 使用命令启用该服务sudo systemctl enable firstboot.service

ExecStart参数指定脚本的路径。该Type=oneshot参数确保服务仅运行一次,然后其状态被视为“非活动”。该RemainAfterExit=yes参数确保进程退出后服务不再被视为“活动” ExecStart

方法 5:使用跟踪文件

另一种方法是创建跟踪文件并退出脚本(如果该文件已存在)。这确保脚本仅在跟踪文件不存在时运行,即在第一次启动时运行。

这是一个例子:

#!/bin/bash
if [ -f /var/run/my_script_has_run ]; then
 exit 0
fi
# Your commands here
touch /var/run/my_script_has_run

if [ -f /var/run/my_script_has_run ]; then exit 0; fi命令检查跟踪文件是否存在,如果存在则退出脚本。该touch /var/run/my_script_has_run命令在脚本运行后创建跟踪文件。

总之,有多种方法可以在 Linux 上仅在首次启动时运行脚本。根据您的具体需求和脚本的性质,您可以选择最适合您的方法。几种方法的区别参见 详解 /etc/rc.local & /etc/init.d/ 和 systemd

常见问题

1. 如何确定这是否是Linux的首次启动?

确定是否是首次启动的一种方法是检查是否存在可以在脚本执行期间创建的跟踪文件。如果跟踪文件不存在,则说明这是第一次启动。

2. 我可以将本文中提到的方法用于其他 Linux 发行版吗?

是的,本文提到的方法也可以用于其他 Linux 发行版。但是,文件路径和特定工具可能会有所不同,因此您需要进行相应调整。

3. 我可以使用这些方法在首次启动时运行多个脚本吗?

是的,您可以使用这些方法在首次启动时运行多个脚本。您可以将所有命令包含在单个脚本中,也可以创建单独的脚本并使用这些方法逐一运行它们。

4. 第一次启动后可以修改脚本吗?

是的,您可以在首次启动后修改脚本。但是,根据您使用的方法,您可能需要相应地调整脚本或配置文件,以确保它仅在第一次启动时运行。

5. 有没有办法在第一次启动时检查脚本是否成功执行? 您可以在脚本中包含错误处理和日志记录机制来检查它是否已成功执行。您可以记录输出或使用退出代码来指示脚本执行的成功或失败。