0

0

Linux 服务启动顺序如何控制?

舞夢輝影

舞夢輝影

发布时间:2026-01-24 16:58:02

|

820人浏览过

|

来源于php中文网

原创

systemd通过After=和Requires=声明依赖关系控制启动顺序,After=仅表示时间先后,Requires=才是硬性前提;漏写Requires=易致服务因依赖失败而异常,应优先修改/etc/下的单元文件并执行daemon-reload。

linux 服务启动顺序如何控制?

After=Requires= 控制服务启动先后

systemd 不靠“谁排第几个”决定顺序,而是靠依赖声明。你写 After=network.target,只表示“我比 network.target 启动得晚”,但不保证 network.target 一定成功;而加了 Requires=network.target,就变成硬性前提——如果 network.target 启动失败,你的服务压根不会尝试启动。

常见错误是只写 After= 却漏掉 Requires=,结果网络还没通,你的服务就急着连数据库,直接超时失败。反过来,对非关键服务(比如日志轮转),应避免滥用 Requires=,改用 Wants= 降低耦合。

  • 查当前服务的依赖:运行 systemctl show nginx.service -p Wants,Requires,After
  • 修改前先备份原文件:sudo cp /usr/lib/systemd/system/nginx.service /etc/systemd/system/nginx.service(优先改 /etc/ 下副本)
  • 改完必须执行 sudo systemctl daemon-reload,否则 enablerestart 都不生效

为什么 systemctl enable 不等于“立刻按顺序启动”

systemctl enable 只是创建软链接到 /etc/systemd/system/multi-user.target.wants/,让服务被 multi-user.target 拉起——但它不指定“在哪个时刻启动”,真正顺序由单元文件里的 After=Wants= 等字段决定。很多人禁用一个服务后发现另一个服务也起不来,其实是后者在单元文件里写了 Requires= 前者,而非启动脚本里有硬编码调用。

  • 检查某服务是否真被启用:systemctl is-enabled servicename(输出 enabled 才算)
  • 确认它是否实际参与了本次启动:systemctl status servicenameLoaded: 行末尾是否带 enabled,且 Active:active (running)
  • 禁用服务用 sudo systemctl disable servicename,不是删文件,也不是改 WantedBy= 字段

可视化启动瓶颈:用 systemd-analyze plot 找卡点

系统启动慢,不一定是某个服务本身慢,更可能是它前面一堆服务串行堵着。比如 postgresql.service 被设为 After=network.target,但 network.target 又等 systemd-networkd-wait-online.service(默认超时 2 分钟),结果整个数据库启动被拖垮。

启科PHP淘宝客系统
启科PHP淘宝客系统

1、请上传下载到的淘宝客系统安装包并上传到空间根目录中进行解压,解压后将网站文件移动到根目录的位置,然后访问 /install 进行安装。您也可以在本地解压,并以二进制方式将程序上传至您的网站空间。 2、同意启科网络电子商务系统安装协议进入下一步。 3、如果系统检测环境通过,则会提示输入您的数据库服务器地址(一般为本机,即127.0.0.1或者localhost)、数据库账号、数据库密码、数据库名

下载
  • 生成 SVG 启动时序图:systemd-analyze plot > boot.svg,用浏览器打开就能看到哪段横条最长、哪些服务并行度低
  • 快速定位耗时大户:systemd-analyze blame 列出各服务启动耗时(单位 ms),排第一的未必是问题根源,但值得优先看它的 After= 依赖链
  • 若某服务只需网络“可达”而非“完全在线”,把 After=network-online.target 改成 After=network.target,再加 Wants=network.target,能跳过等待 DHCP 的长延迟

别碰 /etc/rc.local —— 它和 systemd 有隐式冲突

很多老教程教你在 /etc/rc.local 里写启动命令,但在 systemd 系统中,这个文件本质是通过 rc-local.service 单元来加载的,它默认 After=multi-user.target,但没声明 Wants= 任何具体服务。结果就是:你的脚本可能在 MySQL 还没起来时就去连库,或者在 Docker socket 尚未就绪时就执行 docker run,报错 connection refused

  • 替代方案:写一个专用 .service 文件,明确写 After=mysqld.serviceRequires=mysqld.service
  • 如果只是想开机跑一条命令,用 systemd-run --on-boot --scope --unit=my-onboot-script /path/to/script.sh(需 systemd v249+)
  • 检查 rc-local.service 是否启用:systemctl is-enabled rc-local,Ubuntu 22.04+ 默认已禁用,强行启用反而易出问题

最常被忽略的一点:服务单元文件里写的 After= 是“相对顺序”,不是“绝对时间点”。哪怕你把所有服务都设成 After=multi-user.target,systemd 仍会按依赖图自动调度并行度——所以别迷信“我把 A 改成 After=B,B 就一定先于 A 启动”,最终顺序还得看整个依赖网如何收敛。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

665

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

247

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

515

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

256

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

531

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

600

2023.08.14

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.9万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 808人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号