如何设置服务启动顺序 systemd依赖关系排序技巧
发布时间 - 2025-07-25 00:00:00 点击率:次systemd 控制服务启动顺序需使用 after 和 before 字段。1. wants= 表示软依赖,目标服务未启动不影响当前服务;2. requires= 表示硬依赖,目标服务必须成功启动;3. after= 指定当前服务在其之后启动的目标服务;4. before= 指定当前服务在其之前启动的目标服务;5. 建议配合使用 wants 和 after 避免滥用 requires;6. 可通过 systemctl list-dependencies 查看依赖关系;7. 配置时避免循环依赖,否则 systemd 会报错。
在用 systemd 管理服务的时候,控制服务的启动顺序是个常见需求。比如数据库得先启动,应用服务才能连接上。Systemd 本
身有一套依赖机制来处理这个问题,但如果不了解它的逻辑,容易配错或者误以为“重启就能好”。
理解 Wants 和 Requires
Systemd 中最基础的依赖关系是 Wants= 和 Requires=,它们都定义在 service 文件的 [Unit] 段中。
-
Wants=是软依赖:如果它指向的服务没启动成功,不影响当前服务。 -
Requires=是硬依赖:目标服务必须启动成功,否则当前服务也不会被启动。
这两个字段只表示“依赖哪些服务”,不直接控制启动顺序。也就是说,如果你只是加了 Wants=xxx.service,systemd 不保证这个服务会在你当前服务之前启动。
控制启动顺序靠的是 After 和 Before
真正决定启动顺序的是 After= 和 Before= 字段。比如你想让 A 服务在 B 之后启动,就在 A 的 service 文件里加上:
After=B.service
反过来如果你想让 A 在 B 前面启动,就给 A 加:
Before=B.service
通常做法是两者配合使用。例如:
# a.service [Unit] After=b.service # b.service [Unit] Before=a.service
虽然只写一个也能生效,但双向声明更清晰、不容易出错。
实际配置建议和注意事项
- 别滥用 Requires:除非服务必须存在,否则优先用 Wants + After。
-
跨层级依赖要小心:比如某个服务依赖网络,可以设置
After=network-online.target,同时加上Wants=network-online.target。 - 循环依赖会报错:比如 A 要在 B 后启动,B 又要在 A 后启动,systemd 会拒绝加载。
-
查看依赖关系可以用命令:
-
systemctl list-dependencies your-service systemctl list-dependencies --reverse your-service
-
总结一下怎么操作
举个例子:假设你有一个 webapp 服务,它需要等 mysql 启动后再启动。
-
编辑 webapp.service 文件:
sudo systemctl edit webapp.service
-
添加如下内容:
[Unit] Wants=mysql.service After=mysql.service
-
重载 systemd 配置:
sudo systemctl daemon-reload
-
重启或启动服务验证:
sudo systemctl restart webapp
基本上就这些。理解清楚 Wants/Requires 和 After/Before 的区别,再按需配置,就能控制好服务的启动顺序了。
# mysql
# 区别
# 循环
# 数据库
# 的是
# 如果你
# 就能
# 想让
# 报错
# 重启
# 是个
# 就在
# 也能
# 可以用
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
想要更高端的建设网站,这些原则一定要坚持!
成都网站制作公司哪家好,四川省职工服务网是做什么用?
原生JS实现图片轮播切换效果
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
中国移动官方网站首页入口 中国移动官网网页登录
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
EditPlus中的正则表达式实战(6)
Python函数文档自动校验_规范解析【教程】
iOS正则表达式验证手机号、邮箱、身份证号等
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
如何在企业微信快速生成手机电脑官网?
JavaScript如何实现路由_前端路由原理是什么
LinuxShell函数封装方法_脚本复用设计思路【教程】
javascript读取文本节点方法小结
如何快速生成专业多端适配建站电话?
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
nodejs redis 发布订阅机制封装实现方法及实例代码
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
如何用JavaScript实现文本编辑器_光标和选区怎么处理
利用JavaScript实现拖拽改变元素大小
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
如何在阿里云服务器自主搭建网站?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
微信推文制作网站有哪些,怎么做微信推文,急?
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
什么是javascript作用域_全局和局部作用域有什么区别?
如何在IIS7上新建站点并设置安全权限?
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
如何快速搭建高效服务器建站系统?
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
iOS发送验证码倒计时应用
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
详解CentOS6.5 安装 MySQL5.1.71的方法
Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)
如何在阿里云域名上完成建站全流程?
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
lovemo网页版地址 lovemo官网手机登录
零基础网站服务器架设实战:轻量应用与域名解析配置指南
Laravel如何构建RESTful API_Laravel标准化API接口开发指南
JavaScript常见的五种数组去重的方式
Swift中switch语句区间和元组模式匹配
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?

