1.概要
ubuntu启动后直接执行一个脚本
- 方法一:使用
rc.local
- 方法二:使用
systemd
服务 - 方法三:使用
crontab
的@reboot
选项 (这个方法最简单)
选择其中一种方法,根据你的需求和系统配置来决定。如果你希望脚本在系统完全启动后执行,并且依赖于网络服务或其他系统服务,使用 systemd
服务可能是更好的选择。如果你只是需要简单地运行一个脚本,rc.local
或 crontab
的 @reboot
选项可能更方便。
2.内容
在 Ubuntu 系统中,如果你希望在系统启动后自动执行一个脚本,可以使用多种方法。以下是一些常见的方法:
方法一:使用 rc.local
- 编辑
rc.local
文件:rc.local
文件通常在/etc
目录下。如果文件不存在,可以手动创建它。- 打开终端,使用文本编辑器编辑或创建
rc.local
文件,例如:sudo nano /etc/rc.local
- 在文件中添加你的脚本路径,确保在
exit 0
之前。例如:#!/bin/sh -e /path/to/your/script.sh exit 0
- 确保
rc.local
是可执行的:- 运行以下命令以确保
rc.local
文件具有可执行权限:sudo chmod +x /etc/rc.local
- 运行以下命令以确保
- 启用
rc-local
服务(如果未启用):- 在某些 Ubuntu 版本中,
rc-local
服务可能默认是禁用的。运行以下命令启用它:sudo systemctl enable rc-local
- 在某些 Ubuntu 版本中,
方法二:使用 systemd
服务
-
创建一个新的
systemd
服务单元文件:- 在
/etc/systemd/system/
目录下创建一个新的服务文件,例如myscript.service
:sudo nano /etc/systemd/system/myscript.service
- 在
-
编辑服务文件:
- 添加以下内容到服务文件中(根据你的实际需求调整路径和描述):
[Unit] Description=My Script Service After=network.target [Service] ExecStart=/path/to/your/script.sh Restart=always [Install] WantedBy=multi-user.target
- 添加以下内容到服务文件中(根据你的实际需求调整路径和描述):
-
保存并关闭文件。
-
重新加载
systemd
配置:- 运行以下命令以重新加载
systemd
配置:sudo systemctl daemon-reload
- 运行以下命令以重新加载
-
启用并启动服务:
- 启用服务以便在启动时自动运行:
sudo systemctl enable myscript.service
- 立即启动服务:
sudo systemctl start myscript.service
- 启用服务以便在启动时自动运行:
方法三:使用 crontab
的 @reboot
选项
- 编辑
crontab
:- 打开终端,编辑当前用户的
crontab
:crontab -e
- 打开终端,编辑当前用户的
- 添加
@reboot
条目:- 在
crontab
文件中添加一行,使用@reboot
指定在系统启动时运行的脚本:@reboot /path/to/your/script.sh
- 在
- 保存并关闭
crontab
编辑器。
选择其中一种方法,根据你的需求和系统配置来决定。如果你希望脚本在系统完全启动后执行,并且依赖于网络服务或其他系统服务,使用 systemd
服务可能是更好的选择。如果你只是需要简单地运行一个脚本,rc.local
或 crontab
的 @reboot
选项可能更方便。
3.关联链接
ubuntu启动后直接执行一个脚本- rc.local-CSDN博客
ubuntu启动后直接执行一个脚本-使用 systemd 服务-CSDN博客
4.关联知识
1.sudo nano /etc/rc.local
使用 sudo nano /etc/rc.local
命令可以编辑 /etc/rc.local
文件,以便在系统启动时自动运行特定的脚本或命令。以下是如何使用这个文件的步骤:
编辑 /etc/rc.local
文件
- 打开终端:
- 按
Ctrl + Alt + T
打开终端窗口。
- 按
- 编辑
rc.local
文件:- 输入以下命令并按回车:
sudo nano /etc/rc.local
- 这将使用
nano
文本编辑器打开/etc/rc.local
文件。如果文件不存在,nano
会创建一个新的空白文件。
- 输入以下命令并按回车:
- 修改
rc.local
文件:- 确保文件以
#!/bin/sh -e
开头,这是rc.local
的标准 shebang 行。 - 在
exit 0
行之前添加你希望在启动时运行的脚本或命令。例如:#!/bin/sh -e /path/to/your/script.sh exit 0
- 确保用你的实际脚本路径替换
/path/to/your/script.sh
。
- 确保文件以
- 保存并退出
nano
:- 按
Ctrl + O
保存文件。 - 按
Enter
确认文件名。 - 按
Ctrl + X
退出nano
编辑器。
- 按
确保 rc.local
是可执行的
- 运行以下命令以确保
rc.local
文件具有可执行权限:sudo chmod +x /etc/rc.local
启用 rc-local
服务(如果未启用)
- 在某些 Ubuntu 版本中,
rc-local
服务可能默认是禁用的。运行以下命令启用它:sudo systemctl enable rc-local
验证
- 重启你的系统以验证
rc.local
是否正常工作,并检查你的脚本是否在启动时执行。
通过这些步骤,你可以利用 rc.local
文件在系统启动时自动运行自定义脚本或命令。如果 rc.local
方法不适合你的需求,你还可以考虑使用 systemd
服务或 crontab
的 @reboot
选项。
2.rc-local
rc-local
是一个在基于 Linux 的系统中用于配置系统启动时执行命令的服务。尽管在一些现代系统中,rc-local
逐渐被 systemd
等更现代的系统和服务管理器所取代,但在某些场景下,rc-local
仍然是一个有用的工具。以下是关于 rc-local
的详细解析:
1. 作用
- 系统启动时执行命令:
rc-local
服务在系统所有服务加载完成后执行,允许开发人员或系统管理员在系统启动时运行自定义的脚本或命令。
2. 文件位置
- 配置文件:
rc-local
服务的配置文件通常位于/etc/systemd/system/rc-local.service
或/lib/systemd/system/rc-local.service
。在某些系统中,可能还需要在/etc/
目录下创建一个rc.local
脚本文件。
3. 配置步骤
以 Ubuntu 系统为例,配置 rc-local
服务的步骤通常如下:
-
检查
rc-local
服务是否存在:ls /lib/systemd/system | grep rc-local
如果文件不存在,可能需要手动创建。
-
编辑
rc-local.service
文件:sudo nano /lib/systemd/system/rc-local.service
文件内容可能如下(具体取决于系统配置):
[Unit] Description=/etc/rc.local Compatibility ConditionPathExists=/etc/rc.local [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 StandardOutput=tty RemainAfterExit=yes SysVStartPriority=99 [Install] WantedBy=multi-user.target
注意:确保
[Install]
部分包含WantedBy=multi-user.target
,以便服务在系统启动时自动运行。 -
创建
rc.local
脚本文件:如果系统中不存在
/etc/rc.local
文件,需要手动创建:sudo nano /etc/rc.local
文件内容可能如下:
#!/bin/bash /path/to/your/script.sh exit 0
确保文件以
#!/bin/bash
开头,并在exit 0
之前添加你希望在启动时运行的脚本或命令。 -
设置文件权限:
sudo chmod +x /etc/rc.local
-
启用
rc-local
服务:sudo systemctl enable rc-local
-
启动
rc-local
服务:sudo systemctl start rc-local
-
验证服务状态:
sudo systemctl status rc-local
确保服务处于活动状态,并且没有错误输出。
4. 注意事项
- 权限问题:在
rc.local
脚本中运行的命令需要以 root 权限执行。 - 兼容性:在一些现代 Linux 发行版中,
rc-local
可能已经被弃用。在这些系统中,建议使用systemd
服务来管理系统启动任务。 - 错误处理:如果
rc.local
脚本中包含错误或无法执行的命令,可能会导致系统启动失败或进入紧急模式。因此,建议在脚本中添加适当的错误处理逻辑。
5. 替代方案
- systemd 服务:对于现代 Linux 系统,建议使用
systemd
服务来管理系统启动任务。可以通过创建自定义的systemd
服务文件来实现类似rc-local
的功能。
通过以上步骤,你可以配置 rc-local
服务在系统启动时自动运行自定义的脚本或命令。然而,对于现代 Linux 系统,建议使用 systemd
服务作为更现代和灵活的解决方案。
3.问题分析
topeet@topeet:/etc$ sudo systemctl enable rc-local
The unit files have no installation config (WantedBy=, RequiredBy=, Also=,
Alias= settings in the [Install] section, and DefaultInstance= for template
units). This means they are not meant to be enabled using systemctl.
Possible reasons for having this kind of units are:
• A unit may be statically enabled by being symlinked from another unit's
.wants/ or .requires/ directory.
• A unit's purpose may be to act as a helper for some other unit which has
a requirement dependency on it.
• A unit may be started when needed via activation (socket, path, timer,
D-Bus, udev, scripted systemctl call, ...).
• In case of template units, the unit is meant to be enabled with some
instance name specified
当你尝试使用 sudo systemctl enable rc-local
命令启用 rc-local
服务时,收到错误信息表明该服务单元文件没有安装配置(即没有 WantedBy=
、RequiredBy=
、Also=
或 Alias=
设置),这意味着它不是通过 systemctl enable
命令来启用的。这通常发生在以下几种情况:
可能的原因和解决方案
- 服务单元文件不完整或错误:
-
检查
/lib/systemd/system/rc-local.service
或/etc/systemd/system/rc-local.service
文件,确保[Install]
部分存在并包含WantedBy=multi-user.target
。 -
如果文件不存在或不完整,你可能需要手动创建或编辑它。以下是一个基本的
rc-local.service
文件示例:[Unit] Description=/etc/rc.local Compatibility ConditionPathExists=/etc/rc.local [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 StandardOutput=tty RemainAfterExit=yes SysVStartPriority=99 [Install] WantedBy=multi-user.target
-
rc.local
脚本不存在:-
确保
/etc/rc.local
文件存在并且是可执行的。 -
如果文件不存在,创建一个新的并添加你希望在启动时执行的命令:
#!/bin/sh -e # 在这里添加你的启动命令 exit 0
-
然后设置文件为可执行:
sudo chmod +x /etc/rc.local
-
- 使用其他机制启动:
- 如果
rc-local
服务不适合你的系统配置,考虑使用其他方法来在启动时运行脚本,比如systemd
服务或cron
的@reboot
选项。
- 如果
- 模板单元:
- 如果
rc-local
是一个模板单元(通常不太可能),你需要指定一个实例名来启用它。不过,这在rc-local
的上下文中是不常见的。
- 如果
- 系统兼容性:
- 在某些 Linux 发行版中,
rc-local
可能已经被弃用或不再默认启用。确保你的系统支持rc-local
,或者考虑使用更现代的systemd
服务。
- 在某些 Linux 发行版中,
替代方案
如果你发现 rc-local
在你的系统上难以配置或使用,以下是一些替代方案:
- 创建自定义
systemd
服务:- 编写一个自定义的
systemd
服务单元文件,并将其放置在/etc/systemd/system/
目录下。 - 使用
systemctl enable
和systemctl start
命令来启用和启动该服务。
- 编写一个自定义的
- 使用
cron
的@reboot
:- 编辑用户的
crontab
文件,添加一行以@reboot
开头的命令,这样可以在系统启动时执行指定的脚本或命令。
- 编辑用户的
通过这些步骤和替代方案,你应该能够找到一个适合的方法来在系统启动时运行你需要的脚本或命令。
4.问题翻译
topeet@topeet:/etc$ sudo systemctl enable rc-local
The unit files have no installation config (WantedBy=, RequiredBy=, Also=,
Alias= settings in the [Install] section, and DefaultInstance= for template
units). This means they are not meant to be enabled using systemctl.
Possible reasons for having this kind of units are:
• A unit may be statically enabled by being symlinked from another unit's
.wants/ or .requires/ directory.
• A unit's purpose may be to act as a helper for some other unit which has
a requirement dependency on it.
• A unit may be started when needed via activation (socket, path, timer,
D-Bus, udev, scripted systemctl call, ...).
• In case of template units, the unit is meant to be enabled with some
instance name specif
以下是你提供的错误信息的中文翻译:
topeet@topeet:/etc$ sudo systemctl enable rc-local
该服务单元文件没有安装配置(即在 [Install] 部分没有 WantedBy=、RequiredBy=、Also=、Alias= 设置,以及模板单元的 DefaultInstance=)。这意味着它不是通过 systemctl enable 命令来启用的。
存在这种类型单元的可能原因有:
• 一个单元可能通过从另一个单元的 .wants/ 或 .requires/ 目录创建符号链接来静态启用。
• 一个单元的目的可能是作为其他单元的辅助,而其他单元对它有依赖要求。
• 一个单元可能在需要时通过激活(套接字、路径、定时器、D-Bus、udev、脚本化的 systemctl 调用等)来启动。
• 在模板单元的情况下,该单元意味着要使用某个实例名称来启用。
这个翻译解释了为什么你无法通过 systemctl enable
命令启用 rc-local
服务,并列出了可能的原因。
5.[Install] WantedBy=multi-user.target
在你的 rc-local.service
文件中,[Install]
部分应该包含 WantedBy=multi-user.target
,这是为了让 systemd
知道在达到 multi-user.target
运行级别时,应该启动 rc-local
服务。以下是一个完整的 rc-local.service
文件示例,确保你的文件包含这些基本部分:
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
说明
- [Unit] 部分:
Description
:描述这个服务的用途。ConditionPathExists=/etc/rc.local
:确保/etc/rc.local
文件存在时才启动这个服务。
- [Service] 部分:
Type=forking
:表示服务会启动一个子进程并退出,而子进程继续运行。ExecStart=/etc/rc.local start
:指定启动命令,通常/etc/rc.local
是一个脚本,不需要start
参数,通常只需/etc/rc.local
即可。TimeoutSec=0
:不设置超时。StandardOutput=tty
:将标准输出定向到终端。RemainAfterExit=yes
:即使服务进程退出,也认为服务是活动状态。SysVStartPriority=99
:设置启动优先级。
- [Install] 部分:
WantedBy=multi-user.target
:指定该服务应在multi-user.target
运行级别启动时自动启动。
步骤
- 编辑或创建服务文件:
- 确保
/etc/systemd/system/rc-local.service
或/lib/systemd/system/rc-local.service
存在,并包含上述内容。
- 确保
- 重新加载
systemd
配置:- 运行
sudo systemctl daemon-reload
以应用更改。
- 运行
- 启用服务:
- 运行
sudo systemctl enable rc-local
以启用服务。
- 运行
- 启动服务:
- 运行
sudo systemctl start rc-local
以立即启动服务。
- 运行
- 检查状态:
- 使用
sudo systemctl status rc-local
检查服务状态,确保它正常运行。
- 使用
通过这些步骤,你应该能够成功配置和启用 rc-local
服务,使其在系统启动时自动运行 /etc/rc.local
脚本。
6.nano 编辑状态的推出命令
在使用 nano
文本编辑器时,如果你想退出编辑模式并保存或丢弃更改,可以使用以下命令:
- 保存更改并退出:
- 按
Ctrl + O
(写入文件,即保存)。- 系统会提示你确认文件名(通常直接按
Enter
即可,除非你要更改文件名)。
- 系统会提示你确认文件名(通常直接按
- 然后按
Ctrl + X
退出nano
。
- 按
- 不保存更改并退出:
- 直接按
Ctrl + X
,系统会提示你是否真的要丢弃更改,确认即可退出。
- 直接按
因此,Ctrl + X
是用来退出的,而 Ctrl + O
是用来保存的。记得先保存再退出,如果你希望保留你所做的更改。
7.^C 取消 表示啥意思
在 nano
文本编辑器中,^C
实际上是指按下 Ctrl + C
。不过,在 nano
的上下文中,Ctrl + C
并不是一个用于取消或退出编辑器的组合键。相反,Ctrl + C
在大多数基于文本的程序(包括 nano
)中通常用于中断当前操作或发送中断信号给正在运行的程序。
然而,在 nano
的正常编辑模式下,Ctrl + C
并不会直接取消编辑或退出编辑器。相反,它可能会显示一个帮助屏幕或者被忽略,具体行为可能取决于 nano
的版本和配置。
在 nano
中,如果你想取消当前的操作(比如搜索或替换),通常可以通过特定的按键组合来退出该模式,比如按 Esc
或 Enter
来取消搜索提示。
对于退出 nano
:
- 保存并退出:按
Ctrl + O
(写入文件),然后按Enter
确认文件名,接着按Ctrl + X
退出。 - 不保存并退出:直接按
Ctrl + X
,系统会提示你是否真的要丢弃更改,确认即可退出。
因此,^C
(即 Ctrl + C
)在 nano
中并不是用来取消编辑或退出的标准方式。它更多地是在命令行环境中用于中断程序执行。
8.设置启用结果
topeet@topeet:~$ sudo systemctl enable rc-local Created symlink /etc/systemd/system/multi-user.target.wants/rc-local.service → /lib/systemd/system/rc-local.service.
当你运行 sudo systemctl enable rc-local
并看到以下输出:
Created symlink /etc/systemd/system/multi-user.target.wants/rc-local.service → /lib/systemd/system/rc-local.service.
这意味着 systemd
已经成功地为 rc-local.service
创建了一个符号链接,使其在系统达到 multi-user.target
运行级别时自动启动。
解释
- 符号链接创建:
/etc/systemd/system/multi-user.target.wants/rc-local.service
是一个指向/lib/systemd/system/rc-local.service
的符号链接。- 这个链接的存在告诉
systemd
,在启动过程中达到multi-user.target
时,应该启动rc-local.service
。
multi-user.target
:- 这是一个运行级别,相当于传统的运行级别 3,表示多用户模式,但没有图形界面。
- 在这个级别,所有系统服务都会启动,用户可以登录系统。
后续步骤
- 启动服务:
- 如果你希望立即启动
rc-local
服务,可以运行:sudo systemctl start rc-local
- 如果你希望立即启动
- 检查服务状态:
- 确保
rc-local
服务正在运行,可以使用:sudo systemctl status rc-local
- 这将显示服务的当前状态和最近的日志条目。
- 确保
- 验证
/etc/rc.local
:- 确保
/etc/rc.local
脚本存在并且具有可执行权限。 - 你可以通过运行以下命令来设置可执行权限(如果尚未设置):
sudo chmod +x /etc/rc.local
- 确保
通过这些步骤,你应该能够成功启用和启动 rc-local
服务,使其在系统启动时自动运行 /etc/rc.local
脚本。