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系统

四、特殊情况处理

  1. 不确定是否systemd
    1. OpenWrt无init.d目录
      1. 容器内无init系统
        1. 各系统无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

        💡

        核心原则

        1. 从外到内:先查系统日志 → 再查程序日志 → 最后代码级调试
        1. 最小化复现:用最简命令排除环境干扰
        1. 对比法:在正常环境执行相同操作对比结果
        按照这个流程,95%的启动问题可在3分钟内定位到根本原因。如果是Docker等容器化应用,只需在第四步改用docker run --entrypoint sh进入容器内部排查即可