CentOS服务启动顺序调整,After与WantedBy参数实例
机器重启后,MySQL总赶在网络还没就绪就抢着启动,结果卡半分钟;NFS挂载又比rpcbind早,导致一堆失败红字。把服务顺序捋顺,是每台CentOS躲不掉的体力活。Systemd 用 After、Before、WantedBy 三条指令就能让单元文件乖乖排队,下面把踩坑过程直接摊开,复制粘贴就能用。

Systemd 启动队列怎么排
Systemd 不看你脚本名字,也不猜依赖,它只认单元文件里写的 After、Before、Wants、Requires、WantedBy。After 决定“我必须在谁之后”,Before 决定“我必须在谁之前”,WantedBy 决定“我被谁拉起来”。写错一条,服务就插队,日志里给你颜色看。
After 参数实战:让 MariaDB 等网络
场景:MariaDB 启动时要向 DNS 解析主机名,网络没好就报 “Can't resolve address”。
步骤:
1 cp /usr/lib/systemd/system/mariadb.service /etc/systemd/system/mariadb.service

2 编辑 Unit 段,加一行:
After=network-online.target
3 systemctl daemon-reload
4 reboot 验证,MariaDB 首次监听端口时间比原来晚 3 秒,但不再重试 30 秒。
要点:network-online.target 由 NetworkManager-wait-online.service 通知,真正等到 IP 地址落盘才放行。
Before 参数实战:让自定义脚本抢在 nginx 前跑

场景:容器里生成的 upstream.conf 必须比 nginx 先到位。
1 写 /etc/systemd/system/pre-nginx.service
[Unit]
Description=Generate upstream.conf
Before=nginx.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/gen_upstream.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
2 systemctl enable pre-nginx.service
3 重启后,nginx 启动前必然已执行完脚本,无缺配置。
WantedBy 参数实战:把服务挂到图形界面之后
场景:某商业软件只许在图形登录后运行,不能提前。
1 在单元文件 Install 段写:
WantedBy=graphical.target
2 systemctl disable yourapp.service 去掉多余链接
3 systemctl enable yourapp.service 重新生成 /etc/systemd/system/graphical.target.wants/yourapp.service
4 结果:只有系统进入图形界面才拉起来,multi-user.target 不会误触发。
混合范例:NFS 客户端正确等待 rpcbind 和网络
默认 /usr/lib/systemd/system/remote-fs.target 已经拉 nfs-client.target,但自己写的挂载单元仍要显式声明:
[Unit]
Description=/data nfs mount
After=network-online.target rpcbind.service
Before=remote-fs.target
[Mount]
What=192.168.5.55:/volume1/data
Where=/data
Type=nfs
Options=vers=4,soft
[Install]
WantedBy=multi-user.target
双保险:After 保证网络与端口映射就绪,Before 保证在 remote-fs.target 之前完成,systemd-analyze plot 看不到任何红色。
调试命令一次记全
systemctl list-dependencies --reverse your.service // 谁依赖我
systemctl show -p After your.service // 看我排在谁后面
systemd-analyze blame | grep your.service // 启动耗时
systemd-analyze critical-chain your.service // 关键路径图
journalctl -u your.service -b // 本次启动日志
常见坑汇总
1 把 After 写成 Wants,服务仍然并行,顺序无效。
2 忘记 daemon-reload,改完单元文件不生效,重启老样子。
3 用 network.target 代替 network-online.target,结果服务启动时 IP 还没拿到。
4 WantedBy=multi-user.target 写进 [Unit] 段,应该放在 [Install] 段。
5 禁用服务时只 systemctl disable,不删除 /etc/systemd/system 里手工建的软链,导致下次 enable 冲突。
想让 CentOS 启动不打架,先画依赖图,再改 After、Before、WantedBy,最后 systemd-analyze 确认红色消失,复制上面模板,五分钟收工。
