ubuntu启动后直接执行一个脚本- rc.local

1.概要

ubuntu启动后直接执行一个脚本

  • 方法一:使用 rc.local
  • 方法二:使用 systemd 服务
  • 方法三:使用 crontab 的 @reboot 选项 (这个方法最简单)

选择其中一种方法,根据你的需求和系统配置来决定。如果你希望脚本在系统完全启动后执行,并且依赖于网络服务或其他系统服务,使用 systemd 服务可能是更好的选择。如果你只是需要简单地运行一个脚本,rc.local 或 crontab 的 @reboot 选项可能更方便。

2.内容

在 Ubuntu 系统中,如果你希望在系统启动后自动执行一个脚本,可以使用多种方法。以下是一些常见的方法:

方法一:使用 rc.local

  1. 编辑 rc.local 文件
    • rc.local 文件通常在 /etc 目录下。如果文件不存在,可以手动创建它。
    • 打开终端,使用文本编辑器编辑或创建 rc.local 文件,例如:

      sudo nano /etc/rc.local

    • 在文件中添加你的脚本路径,确保在 exit 0 之前。例如:
      #!/bin/sh -e
      /path/to/your/script.sh
      exit 0
  2. 确保 rc.local 是可执行的
    • 运行以下命令以确保 rc.local 文件具有可执行权限:

      sudo chmod +x /etc/rc.local

  3. 启用 rc-local 服务(如果未启用):
    • 在某些 Ubuntu 版本中,rc-local 服务可能默认是禁用的。运行以下命令启用它:

      sudo systemctl enable rc-local

方法二:使用 systemd 服务

  1. 创建一个新的 systemd 服务单元文件

    • 在 /etc/systemd/system/ 目录下创建一个新的服务文件,例如 myscript.service

      sudo nano /etc/systemd/system/myscript.service

  2. 编辑服务文件

    • 添加以下内容到服务文件中(根据你的实际需求调整路径和描述):
      [Unit]
      Description=My Script Service
      After=network.target
      
      
      [Service]
      ExecStart=/path/to/your/script.sh
      Restart=always
      
      
      [Install]
      WantedBy=multi-user.target
  3. 保存并关闭文件

  4. 重新加载 systemd 配置

    • 运行以下命令以重新加载 systemd 配置:

      sudo systemctl daemon-reload

  5. 启用并启动服务

    • 启用服务以便在启动时自动运行:

      sudo systemctl enable myscript.service

    • 立即启动服务:
       

      sudo systemctl start myscript.service

方法三:使用 crontab 的 @reboot 选项

  1. 编辑 crontab
    • 打开终端,编辑当前用户的 crontab

      crontab -e

  2. 添加 @reboot 条目
    • 在 crontab 文件中添加一行,使用 @reboot 指定在系统启动时运行的脚本:

      @reboot /path/to/your/script.sh

  3. 保存并关闭 crontab 编辑器

选择其中一种方法,根据你的需求和系统配置来决定。如果你希望脚本在系统完全启动后执行,并且依赖于网络服务或其他系统服务,使用 systemd 服务可能是更好的选择。如果你只是需要简单地运行一个脚本,rc.local 或 crontab 的 @reboot 选项可能更方便。

3.关联链接

ubuntu启动后直接执行一个脚本- rc.local-CSDN博客

ubuntu启动后直接执行一个脚本-使用 systemd 服务-CSDN博客

使用 systemd 服务-异常处理-CSDN博客

4.关联知识

1.sudo nano /etc/rc.local

使用 sudo nano /etc/rc.local 命令可以编辑 /etc/rc.local 文件,以便在系统启动时自动运行特定的脚本或命令。以下是如何使用这个文件的步骤:

编辑 /etc/rc.local 文件

  1. 打开终端
    • 按 Ctrl + Alt + T 打开终端窗口。
  2. 编辑 rc.local 文件
    • 输入以下命令并按回车:
       

      sudo nano /etc/rc.local

    • 这将使用 nano 文本编辑器打开 /etc/rc.local 文件。如果文件不存在,nano 会创建一个新的空白文件。
  3. 修改 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
  4. 保存并退出 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 服务的步骤通常如下:

  1. 检查 rc-local 服务是否存在

     

    ls /lib/systemd/system | grep rc-local

    如果文件不存在,可能需要手动创建。

  2. 编辑 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,以便服务在系统启动时自动运行。

  3. 创建 rc.local 脚本文件

    如果系统中不存在 /etc/rc.local 文件,需要手动创建:

    sudo nano /etc/rc.local

    文件内容可能如下:

    #!/bin/bash
    /path/to/your/script.sh
    exit 0

    确保文件以 #!/bin/bash 开头,并在 exit 0 之前添加你希望在启动时运行的脚本或命令。

  4. 设置文件权限

    sudo chmod +x /etc/rc.local
  5. 启用 rc-local 服务

    sudo systemctl enable rc-local

  6. 启动 rc-local 服务

    sudo systemctl start rc-local

  7. 验证服务状态

    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 命令来启用的。这通常发生在以下几种情况:

可能的原因和解决方案

  1. 服务单元文件不完整或错误
    • 检查 /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
  2. rc.local 脚本不存在
    • 确保 /etc/rc.local 文件存在并且是可执行的。

    • 如果文件不存在,创建一个新的并添加你希望在启动时执行的命令:

      #!/bin/sh -e
      # 在这里添加你的启动命令
      exit 0
    • 然后设置文件为可执行:

      sudo chmod +x /etc/rc.local
  3. 使用其他机制启动
    • 如果 rc-local 服务不适合你的系统配置,考虑使用其他方法来在启动时运行脚本,比如 systemd 服务或 cron 的 @reboot 选项。
  4. 模板单元
    • 如果 rc-local 是一个模板单元(通常不太可能),你需要指定一个实例名来启用它。不过,这在 rc-local 的上下文中是不常见的。
  5. 系统兼容性
    • 在某些 Linux 发行版中,rc-local 可能已经被弃用或不再默认启用。确保你的系统支持 rc-local,或者考虑使用更现代的 systemd 服务。

替代方案

如果你发现 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 运行级别启动时自动启动。

步骤

  1. 编辑或创建服务文件
    • 确保 /etc/systemd/system/rc-local.service 或 /lib/systemd/system/rc-local.service 存在,并包含上述内容。
  2. 重新加载 systemd 配置
    • 运行 sudo systemctl daemon-reload 以应用更改。
  3. 启用服务
    • 运行 sudo systemctl enable rc-local 以启用服务。
  4. 启动服务
    • 运行 sudo systemctl start rc-local 以立即启动服务。
  5. 检查状态
    • 使用 sudo systemctl status rc-local 检查服务状态,确保它正常运行。

通过这些步骤,你应该能够成功配置和启用 rc-local 服务,使其在系统启动时自动运行 /etc/rc.local 脚本。

6.nano 编辑状态的推出命令 

在使用 nano 文本编辑器时,如果你想退出编辑模式并保存或丢弃更改,可以使用以下命令:

  1. 保存更改并退出
    • 按 Ctrl + O(写入文件,即保存)。
      • 系统会提示你确认文件名(通常直接按 Enter 即可,除非你要更改文件名)。
    • 然后按 Ctrl + X 退出 nano
  2. 不保存更改并退出
    • 直接按 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,表示多用户模式,但没有图形界面。
    • 在这个级别,所有系统服务都会启动,用户可以登录系统。

后续步骤

  1. 启动服务
    • 如果你希望立即启动 rc-local 服务,可以运行:
       

      sudo systemctl start rc-local

  2. 检查服务状态
    • 确保 rc-local 服务正在运行,可以使用:
       

      sudo systemctl status rc-local

    • 这将显示服务的当前状态和最近的日志条目。
  3. 验证 /etc/rc.local
    • 确保 /etc/rc.local 脚本存在并且具有可执行权限。
    • 你可以通过运行以下命令来设置可执行权限(如果尚未设置):
       

      sudo chmod +x /etc/rc.local

通过这些步骤,你应该能够成功启用和启动 rc-local 服务,使其在系统启动时自动运行 /etc/rc.local 脚本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值