ubuntu(8)update-rc.d管理服务

update-rc.d 是 Ubuntu(以及其他基于 Debian 的系统)中用于管理系统服务启动脚本的工具,主要用于控制 System V 初始化脚本(SysVinit)的启用、禁用或配置服务的启动顺序和运行级别。

  • ubuntu-16-(之前系统的,传统systemV管理方式)

1. 什么是 update-rc.d

  • update-rc.d 是 Debian 系系统中的一个命令行工具,用于管理 /etc/rcX.d/ 目录下的服务启动链接。
  • 这些链接决定了系统在不同运行级别(runlevel)下启动或停止哪些服务。
  • 它主要处理位于 /etc/init.d/ 目录下的初始化脚本,并根据配置在适当的运行级别目录(如 /etc/rc0.d//etc/rc1.d/ 等)中创建符号链接。

2. 基本语法

1
update-rc.d [-n] [-f] <服务名> <命令> [运行级别]
  • 选项
    • -n:模拟运行,不实际修改文件系统(用于测试)。
    • -f:强制删除已有链接,即使服务脚本未标记为可移除。
  • 服务名/etc/init.d/ 目录下脚本的名称(不包含路径)。
  • 命令
    • defaults:以默认设置启用服务(通常在运行级别 2、3、4、5 启动,在 0、1、6 停止)。
    • enable:启用服务(可以指定运行级别)。
    • disable:禁用服务(可以指定运行级别)。
    • remove:移除服务的启动链接(通常需要服务脚本已删除)。
    • start|stop:手动设置启动或停止的顺序和运行级别。
  • 运行级别:可选,指定服务在哪些运行级别(0-6,S)生效。

3. 常见用法

以下是一些常见的 update-rc.d 使用场景:

(1) 启用服务(使用默认设置)

1
sudo update-rc.d 服务名 defaults
  • 这会在运行级别 2、3、4、5 中启用服务启动,在 0、1、6 中停止服务。
  • 例如,启用 nginx 服务:
    1
    sudo update-rc.d nginx defaults
  • 效果:在 /etc/rc2.d/ 等目录下创建启动链接(如 S01nginx),在 /etc/rc0.d/ 等创建停止链接(如 K01nginx)。

(2) 禁用服务

1
sudo update-rc.d 服务名 disable
  • 禁用服务在所有运行级别的启动,但保留符号链接(标记为禁用状态)。
  • 例如,禁用 nginx
    1
    sudo update-rc.d nginx disable

(3) 重新启用服务

1
sudo update-rc.d 服务名 enable
  • 重新启用已被禁用的服务。
  • 例如:
    1
    sudo update-rc.d nginx enable

(4) 移除服务

1
sudo update-rc.d -f 服务名 remove
  • 删除服务的所有启动/停止链接,通常在卸载服务时使用。
  • 注意:需要确保 /etc/init.d/ 下的脚本已删除,否则可能需要加 -f 强制删除。
  • 例如:
    1
    sudo update-rc.d -f nginx remove

(5) 自定义启动顺序和运行级别

可以手动指定启动顺序和运行级别:

1
sudo update-rc.d 服务名 start 20 2 3 4 5 . stop 80 0 1 6 .
  • start 20 2 3 4 5:在运行级别 2、3、4、5 中启动服务,顺序号为 20。
  • stop 80 0 1 6:在运行级别 0、1、6 中停止服务,顺序号为 80。
  • 顺序号(sequence number)决定服务启动或停止的先后顺序,数字越小越先执行

(6)服务管理

/etc/initi.d/script-name [ start/stop/restart/status ]

/etc/init.d/ssh start|stop|restart

4. 注意事项

  1. 仅适用于 SysVinit

    • update-rc.d 只适用于传统的 System V 初始化系统。如果系统使用 systemd(Ubuntu 16.04 及以上默认使用),建议使用 systemctl 管理服务(如 systemctl enable 服务名)。
    • 检查系统是否使用 SysVinit:如果 /etc/init.d/ 中有脚本,通常说明支持 update-rc.d
  2. 权限要求

    • 必须以 rootsudo 运行 update-rc.d
  3. 服务脚本要求

    • /etc/init.d/ 下的脚本必须符合 LSB(Linux Standard Base)规范,例如支持 startstoprestart 等参数。
  4. 避免手动修改符号链接

    • 直接编辑 /etc/rcX.d/ 目录下的链接可能导致配置不一致,建议始终使用 update-rc.d
  5. systemd 兼容性

    • 在使用 systemd 的系统中,update-rc.d 可能会被 systemd 包装,实际操作可能转换为 systemd 的服务配置。

5. 示例场景

假设你安装了一个服务 myapp,其初始化脚本位于 /etc/init.d/myapp

  1. 启用服务

    1
    sudo update-rc.d myapp defaults

    输出可能类似于:
    Adding system startup for /etc/init.d/myapp …
    /etc/rc0.d/K01myapp -> ../init.d/myapp
    /etc/rc1.d/K01myapp -> ../init.d/myapp
    /etc/rc6.d/K01myapp -> ../init.d/myapp
    /etc/rc2.d/S01myapp -> ../init.d/myapp
    /etc/rc3.d/S01myapp -> ../init.d/myapp
    /etc/rc4.d/S01myapp -> ../init.d/myapp
    /etc/rc5.d/S01myapp -> ../init.d/myapp

  2. 禁用服务

    1
    sudo update-rc.d myapp disable
  3. 移除服务(假设已删除 /etc/init.d/myapp):

    1
    sudo update-rc.d -f myapp remove

6. 常见问题

  • Q:为什么 update-rc.d 没有效果?

    • A:可能是系统使用 systemd 而非 SysVinit,尝试使用 systemctl 命令(如 systemctl enable 服务名)。
    • A:确保服务脚本存在于 /etc/init.d/ 且具有可执行权限(chmod +x /etc/init.d/服务名)。
  • Q:如何查看当前运行级别?
    标准的运行级别?**

    • 使用 runlevel 命令查看当前运行级别。例如,输出 N 5 表示当前在运行级别 5。
  • Q:如何确认服务是否启用?

    • 检查 /etc/rcX.d/ 目录下的链接,或使用 service 服务名 status 检查服务状态。

7. 替代工具

在现代 Ubuntu 系统中,systemd 已成为默认的初始化系统,推荐使用以下命令代替 update-rc.d

  • 启用服务:sudo systemctl enable 服务名
  • 禁用服务:sudo systemctl disable 服务名
  • 启动服务:sudo systemctl start 服务名
  • 停止服务:sudo systemctl stop 服务名

总结

update-rc.d 是一个强大的工具,用于管理 SysVinit 服务的启动配置,但在使用 systemd 的现代 Ubuntu 系统中已逐渐被 systemctl 取代。如果你的系统仍然使用 SysVinit(如某些嵌入式设备或旧版 Ubuntu),update-rc.d 是配置服务启动的首选工具。