Linux守护进程启动顺序由初始化系统决定:SysV init依运行级别和rcX.d链接名数字排序;Upstart按事件驱动依赖触发;systemd通过Wants=、After=等单元指令精确控制。

Linux系统中守护进程的启动顺序由运行级别(Runlevel)和初始化系统共同决定,不同发行版实现方式差异较大,需区分SysV init、Upstart和systemd三种主流初始化系统。
传统SysV init下的运行级别与启动顺序
SysV init使用运行级别0-6定义系统状态,每个级别对应一组启动脚本。守护进程的启动顺序取决于/etc/rc.d/rcX.d/目录下符号链接的命名规则(X为运行级别),链接名格式为SnnServiceName或KnnServiceName,其中nn是两位数字,决定执行先后:数字越小越早启动,越大越晚。
- 修改启动顺序只需重命名对应链接,例如将S20httpd改为S15httpd可使其比原S20服务更早启动
- 新增服务需在/etc/init.d/放置脚本,并用chkconfig --add servicename注册,再通过chkconfig --level 35 servicename on指定运行级别
- 注意依赖关系需手动维护,系统不自动解析服务间依赖
Upstart管理的启动顺序控制
Ubuntu 9.10–14.10等使用Upstart的系统不再依赖运行级别概念,改用事件驱动模型。守护进程启动顺序由配置文件中的start on、stop on及respawn等指令隐式定义。
- 服务A若声明start on started dbus,则必须等待dbus服务启动完成后才触发
- 可通过start on (filesystem and net-device-up IFACE!=lo)组合多个条件,实现更精细的时序控制
- 查看当前服务状态和依赖链可用initctl list和initctl show-config servicename
systemd中基于单元依赖的启动排序
现代主流发行版(RHEL 7+/CentOS 7+、Ubuntu 16.04+、Debian 8+)采用systemd,完全摒弃运行级别概念,代之以target(如multi-user.target)。守护进程启动顺序由单元文件(.service)中的依赖指令精确控制。
- 关键指令包括Wants=(弱依赖)、Requires=(强依赖)、After=(启动时序)和Before=
- 例如nginx.service中设置After=network.target且Wants=network.target,表示它在网络就绪后启动
- 自定义服务需将.unit文件放入/etc/systemd/system/,运行systemctl daemon-reload重载配置,再用systemctl enable servicename启用
跨初始化系统的兼容性注意事项
混合环境或升级过程中可能同时存在多种机制,容易引发冲突。例如systemd系统中仍保留/etc/init.d/脚本,但实际由systemd-sysv-generator动态生成兼容单元。
- 优先使用原生systemd单元而非SysV脚本,避免启动逻辑不一致
- 检查服务真实启用状态应使用systemctl is-enabled servicename,而非chkconfig --list
- 调试启动失败时,用systemctl status servicename和journalctl -u servicename -b定位具体阶段错误


















