systemd 的核心是声明式依赖建模而非脚本顺序执行:用 After 和 Wants 表达服务间语义依赖,由 systemd 自动调度并行启动;Type= 必须匹配进程模型(如 nginx 用 forking);自定义单元文件须置于 /etc/systemd/system/ 并 daemon-reload。

并行启动、依赖驱动、单元抽象——这是 systemd 区别于 SysV init 的根本所在,不是“更高级的脚本”,而是声明式系统建模。
为什么必须用 After 和 Wants 而不是写启动顺序脚本
传统 SysV init 靠 S01xxx、S02xxx 这类命名强制串行,一卡全停;systemd 则把“服务 A 要在网络就绪后运行”这种语义直接写进配置,由 systemd 自动解析依赖图(DAG),找出所有无依赖的服务并行拉起。比如 nginx.service 设了 After=network.target 且 Wants=network.target,systemd 就不会等 sshd 启完才启 nginx,只要 network.target active,它就可能和 mysql.service 一起启动。
-
After只控制顺序,不保证依赖存在;Wants才真正触发依赖单元的启动(但失败不影响本单元) - 误用
Requires=network.target可能导致网络稍慢时 nginx 直接启动失败——多数场景用Wants更健壮 - 依赖写错会导致
systemctl start卡住或报Job for xxx.service failed. See 'journalctl -xe' for details.
.service 文件里 Type= 值选错,服务就“假死”
systemd 靠 Type= 判断进程生命周期。Nginx 默认是 forking(主进程 fork 子进程后退出),如果你写成 Type=simple,systemd 会把 fork 后退出的主进程当“已结束”,立刻标记服务为 inactive,实际 worker 还在跑——结果 systemctl status 显示 inactive,ps aux | grep nginx 却能看到一堆进程。
WO@BIZ电子商务2.0软件是窝窝团队基于对互联网发展和业务深入研究后,采用互联网2.0的思想设计、开发的电子商务和社会化网络(SNS)结合的解决方案产品。WOBIZ是互联网2.0创业、传统网站转型、中小企业宣传产品网应用的最佳选择。 它精心设计的架构、强大的功能机制、友好的用户体验和灵活的管理系统,适合从个人到企业各方面应用的要求,为您提供一个安全、稳定、高效、 易用而快捷的电子商务2.0网络
-
Type=simple:主进程即服务进程(如 node.js 服务) -
Type=forking:主进程 fork 后退出,需配PIDFile=(如 nginx、redis-server) -
Type=oneshot:执行完命令就退出,常用于初始化脚本,要加RemainAfterExit=yes才算 active
自定义服务一定要放对路径:/etc/systemd/system/ 不是可选项
你写好 myapp.service,扔进 /usr/lib/systemd/system/?不行。这个目录归包管理器管,升级时可能被覆盖。所有手动创建或覆盖的单元文件,必须放在 /etc/systemd/system/ ——这里优先级最高,systemd 会优先读取它。
- 写完记得运行
systemctl daemon-reload,否则systemctl enable会报Failed to enable unit: Unit myapp.service does not exist. - 启用服务用
systemctl enable myapp.service,本质是在/etc/systemd/system/multi-user.target.wants/下建软链接 - 禁用服务不是删文件,而是
systemctl disable myapp.service,否则下次daemon-reload还会生效
真正难的从来不是写对一行 ExecStart,而是理解 systemd 把“系统”看作一张依赖关系网,而不是一串命令。一旦依赖写反、Type 选错、路径放错,它不会报错,只会静默表现异常——查日志得看 journalctl -u myapp.service -n 50,而不是只盯 systemctl status 那两行绿色文字。









