type
status
date
slug
summary
tags
category
icon
password
有时候我们不清楚自己当前 linux 系统具体启动某个程序时候通过 systemctl 还是 etc/init.d 或者其它命令时候,可能经常要网上四处找答案,我目前总结了几种情况,希望能有用:
快速判断系统使用哪种启动方式(systemd/SysVinit/procd等)是必备技能。本文将用最简洁的方式告诉你判断方法。
一、3秒快速判断法
执行这个命令即可:
结果解读:
- 显示
systemd
→ 使用systemd(现代主流系统)
- 显示
procd
→ OpenWrt专用
- 显示
init
→ 传统SysVinit或Upstart
二、详细判断方法
1. 针对物理机/虚拟机
系统类型 | 判断命令 | 服务管理命令 |
systemd系统 | systemctl --version | systemctl start nginx |
传统SysVinit | ls /etc/init.d/ | service nginx start |
OpenWrt | readlink /sbin/init | /etc/init.d/nginx start |
2. 针对容器环境
判断是否在容器中:
容器内启动方式:
- 直接运行应用(无init):
ps -p1
显示应用进程
- 使用runit:
ps -p1
显示runit
- 使用tini:
ps -p1
显示tini
三、各系统服务管理速查
systemd系统(CentOS 7+/Debian 8+/Ubuntu 16.04+)
SysVinit系统(CentOS 6/Debian 7等)
OpenWrt系统
四、特殊情况处理
- 不确定是否systemd:
- OpenWrt无init.d目录:
- 容器内无init系统:
- 各系统无init.d时的备选方案
系统类型 | 查找启动命令的方法 | 手动启动命令示例 |
OpenWrt | grep -r dockerd /etc | /usr/bin/dockerd -H unix:///var/run/docker.sock & |
Debian | systemctl cat docker | sudo dockerd --debug |
CentOS | rpm -ql docker-ce | grep service | sudo /usr/bin/dockerd-current |
记住这个万能命令组合,可以应对99%的场景:
五、启动故障经验
以下是经过实战验证的「五步速查法」,适用于Linux环境下所有服务/工具的启动故障排查:
🚀 通用启动失败排查流程(五步法)
📌 第一步:确认进程状态(10秒)
输出分析重点:
- 进程存在但退出:查看
ExitCode
(如137=OOM killed)
- 进程不存在:检查日志中的
Failed to start
记录
📌 第二步:捕获最近错误日志(15秒)
典型错误线索:
Permission denied
→ 权限问题
Address already in use
→ 端口冲突
No such file or directory
→ 依赖缺失
📌 第三步:验证基础依赖(20秒)
常见雷区:
- 缺少
.so
库文件 → 安装对应dev
包
- 配置文件权限错误 →
chmod 600 配置文件
- $PATH未包含程序路径 →
export PATH=$PATH:/自定义路径
📌 第四步:最小化环境测试(30秒)
适用场景:
- 排查环境变量污染
- 验证是否缺少系统依赖
- 排除配置文件干扰
📌 第五步:高级诊断(按需使用)
典型问题:
Killed process
→ 内存不足
Cannot open shared object
→ 磁盘损坏
EADDRINUSE
→ 端口被占用
📚 故障速查表(按现象反推)
现象 | 优先检查项 | 命令示例 |
程序秒退 | 系统日志 + strace | strace -f 程序名 |
报权限错误 | 文件权限 + SELinux | ls -Z /path/to/file |
端口冲突 | 网络端口占用 | ss -tulnp \| grep 端口号 |
依赖缺失 | ldd + 包管理器 | ldd $(which 程序名) |
配置文件错误 | 程序测试模式 | 程序名 --validate-config |