真正生效需wants=或requires=配合after=;仅after=network.target不触发等待,服务易因网络未就绪而启动失败。

service文件里写什么才算真正生效
只写 After=network.target 不会触发等待逻辑,服务大概率抢在网卡配好 IP 前就启动,然后 bind 失败或 DNS 解析超时。真正起作用的是 Wants= 或 Requires= 配合 After=。
-
Wants=network-online.target+After=network-online.target:系统会尝试拉起等待网络就绪的服务(如systemd-networkd-wait-online.service),失败也不阻塞本服务 -
Requires=network-online.target+After=network-online.target:网络未就绪则本服务直接启动失败,适合强依赖场景(如必须访问远程 API 的采集器) - 单独写
After=network-online.target无效——systemd 不会自动触发等待,它只管顺序,不管就绪
挂载点和上游服务怎么加进依赖链
如果 Nginx 静态文件放在 /mnt/www,SSL 证书在 /mnt/ssl,又反向代理本地 php-fpm.service,那这三类资源必须在 Nginx 启动前就位,否则 403、证书加载失败或 502 就来了。
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
- 挂载点依赖用
.mount单元名,不是路径:比如/mnt/ssl对应的单元是mnt-ssl.mount,需确保该文件存在且已启用 - 上游服务用
Wants=php-fpm.service+After=php-fpm.service,避免 Nginx 先跑起来再连不上 socket - Unix socket 路径(如
/run/php-fpm.sock)的父目录权限要提前处理,ExecStartPre=-/bin/mkdir -p /run/php-fpm比依赖更可靠
Wants 和 Requires 到底选哪个
选错会导致服务启动行为完全偏离预期:用 Requires 却把可选组件写进去,整个服务就卡死;用 Wants 却对关键基础设施放行,结果功能残缺。
-
Wants=:适合“最好有,没有也行”的场景,比如日志转发服务依赖rsyslog.service,但 rsyslog 挂了不影响主业务 -
Requires=:只用于真正不可缺失的环节,比如数据库代理服务必须等postgresql.service启动成功才能初始化连接池 - 注意:
Requires=不等于“一定要启动成功”,而是“启动失败就中止本服务”;若后端服务本身支持延迟就绪(如带重试的客户端),用Wants更稳妥
验证依赖是否真被 systemd 理解了
改完 unit 文件不验证,等于没改。systemd 的依赖图容易藏坑,比如循环依赖、拼写错误的单元名、或者 .mount 单元根本没启用。
- 执行
systemctl daemon-reload后,立刻运行systemctl show nginx.service -p Wants,Requires,After,确认字段值和你写的完全一致 - 用
systemctl list-dependencies nginx.service查看实际解析出的依赖树,重点检查network-online.target是否出现在其中 - 启动失败时,别只看
journalctl -u nginx,加--since "1 hour ago"并过滤Failed to start,常会暴露真实原因(比如mnt-ssl.mount因 NFS server 不可达而超时)
network-online.target 是否真由当前网络管理器激活——NetworkManager 和 systemd-networkd 各自有一套 wait-online 机制,混用或禁用其中一个,会导致 target 永远不会就绪。










