0

0

Linux 服务启动顺序优化实践

冷炫風刃

冷炫風刃

发布时间:2026-02-21 16:07:35

|

243人浏览过

|

来源于php中文网

原创

必须同时配置 after= 和 wants=/requires= 才能确保依赖服务启动,仅 after= 仅控制顺序;usesyslog=yes 已被忽略;type=simple 不保证服务就绪,应改用 type=notify 或 execstartpost 检查健康状态。

linux 服务启动顺序优化实践

systemd 服务依赖写错会导致启动卡住

很多服务看似配置了 After=network.target,但实际启动时仍等不到网络就失败——因为 After 只控制顺序,不建立依赖关系。真正起作用的是 Wants=Requires=

常见错误现象:systemctl status myapp.service 显示 activating (start) 卡住几十秒,日志里反复出现连接 refused;查 journalctl -u myapp.service -n 50 发现应用在尝试连 localhost:5432,但 postgresql.service 还没起来。

  • 必须同时写 After=postgresql.serviceWants=postgresql.service(或 Requires=),否则 systemd 不会主动拉起依赖服务
  • Requires= 失败会导致本服务直接 abort;Wants= 更宽松,适合非强依赖场景
  • 避免循环依赖:比如 A Wants=B、B Wants=A,systemd 会拒绝加载并报错 Found ordering cycle
  • 检查依赖链用:systemctl list-dependencies --reverse myapp.service

自定义服务中 UseSyslog=yes 实际无效

有些老文档建议加 UseSyslog=yes 让日志进 journald,但在现代 systemd(v240+)中这个配置项已被忽略,所有服务默认都走 journal,该字段纯粹是兼容占位符。

真实影响在于日志可检索性和调试效率:如果服务自己用 printfecho 输出到 stdout/stderr,这些内容会被自动捕获;但如果服务后台化(如加了 nohup、重定向到文件、或调用 daemon()),journald 就收不到任何输出。

  • 确认服务是否真正前台运行:ps aux | grep myapp 看有没有 ? 在 TTY 列,或者用 systemctl show myapp.service | grep Type;推荐设为 Type=simple(默认)或 Type=notify
  • 禁用日志重定向:删掉 service 文件里的 StandardOutput=file:/var/log/myapp.log 这类行,让输出保持标准流
  • 若必须写文件,用 StandardOutput=append:/var/log/myapp.log,但记得配好 logrotate,否则 journal 里看不到实时内容

multi-user.target 之前启动的服务容易被 kill

把服务设成 Before=multi-user.target 并不能让它“更早启动”,反而可能因系统初始化阶段资源未就绪而被强制终止——比如此时 cgroup、namespace、甚至 /proc/sys/net 之类路径都还没完全 ready。

装修公司企业网站源码2.0
装修公司企业网站源码2.0

装修公司源码,采用DIV+CSS布局,首页顶部采用了超大宽屏banner焦点图切换,带伸缩功能的导航条。首页信息展示量大,有利于SEO优化,首页版块包括,导航,焦点图切换,案例,行业动态,装修经验,装修知识。源码支持伪静态,后台开启即可,服务器必须支持rewrite功能,否则无法实现伪静态功能。信息支持二级分类。后台支持信息批量修改,删除,可以支持,视频,图片,附件上传。

下载

典型场景:想赶在 sshd 启动前做网络策略加固,结果服务刚 fork 就被 systemd 杀掉,journal 里只有 Killed 没有堆栈。

  • 优先用 WantedBy=multi-user.target + 合理的 After=,而不是强行往前塞
  • 真要抢在基础服务前运行,改用 WantedBy=sysinit.target,但必须确保不依赖任何用户空间设施(如 DNS、磁盘挂载、udev)
  • TimeoutStartSec=90 防止 systemd 因超时误判服务失败
  • systemctl cat myapp.service 确认最终生效的 unit 文件路径,避免被 /etc/systemd/system/ 下的覆盖版本干扰

服务启动慢但 systemctl status 显示 active (running)

active (running) 只代表主进程已 fork 成功,并不表示服务内部已 ready。比如一个 Go Web 服务可能 200ms 就启进程,但还要花 3 秒加载配置、连 DB、预热缓存——这期间发请求必然 502。

这时候靠 Type=simple 是不够的,必须让 systemd 知道“真正 ready”的信号点。

  • 改用 Type=notify,并在代码里调用 sd_notify(0, "READY=1")(C)或用对应语言的 sdnotify 库(如 Python 的 systemd.daemon.notify("READY=1")
  • 没有代码修改权限?用 Type=exec + ExecStartPost=/bin/sh -c 'while ! curl -sf http://127.0.0.1:8080/health; do sleep 0.5; done',但注意别引入死循环风险
  • 检查 readiness:用 systemctl is-system-running 看是否到 running 状态;再用 systemctl show myapp.service | grep ActiveStateSubState 组合判断

最常被忽略的是:After=Wants= 必须成对出现,且目标服务本身得是 enabled 的——哪怕只漏掉一个 systemctl enable postgresql.service,整个依赖链就断在起点。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

103

2023.09.25

curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

452

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

182

2023.10.30

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

76

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

298

2023.11.28

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

421

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

594

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

421

2023.07.18

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

796

2026.02.13

热门下载

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

精品课程

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

共48课时 | 9.5万人学习

Git 教程
Git 教程

共21课时 | 3.8万人学习

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

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