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. 注意事项
仅适用于 SysVinit:
update-rc.d
只适用于传统的 System V 初始化系统。如果系统使用systemd
(Ubuntu 16.04 及以上默认使用),建议使用systemctl
管理服务(如systemctl enable 服务名
)。- 检查系统是否使用 SysVinit:如果
/etc/init.d/
中有脚本,通常说明支持update-rc.d
。
权限要求:
- 必须以
root
或sudo
运行update-rc.d
。
- 必须以
服务脚本要求:
/etc/init.d/
下的脚本必须符合 LSB(Linux Standard Base)规范,例如支持start
、stop
、restart
等参数。
避免手动修改符号链接:
- 直接编辑
/etc/rcX.d/
目录下的链接可能导致配置不一致,建议始终使用update-rc.d
。
- 直接编辑
systemd 兼容性:
- 在使用 systemd 的系统中,
update-rc.d
可能会被 systemd 包装,实际操作可能转换为 systemd 的服务配置。
- 在使用 systemd 的系统中,
5. 示例场景
假设你安装了一个服务 myapp
,其初始化脚本位于 /etc/init.d/myapp
:
启用服务:
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禁用服务:
1
sudo update-rc.d myapp disable
移除服务(假设已删除
/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/服务名
)。
- A:可能是系统使用 systemd 而非 SysVinit,尝试使用
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
是配置服务启动的首选工具。