如何设置服务启动顺序 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 启动后再启动。

  1. 编辑 webapp.service 文件:

    sudo systemctl edit webapp.service
  2. 添加如下内容:

    [Unit]
    Wants=mysql.service
    After=mysql.service
  3. 重载 systemd 配置:

    sudo systemctl daemon-reload
  4. 重启或启动服务验证:

    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语句区间和元组模式匹配  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?