服务显示 inactive (dead) 时应先查 journalctl 日志定位失败原因,再针对性解决配置错误、路径缺失、端口占用或权限问题,而非直接 start。

服务没启动,systemctl status 显示 inactive (dead) 怎么办
先别急着 systemctl start,很多情况下服务根本起不来,强行启动只会重复失败。重点看 systemctl status <service-name></service-name> 输出末尾的 Failed with result 'exit-code' 或 'timeout',再立刻跟一句 journalctl -u <service-name> --since "1 hour ago" -n 50</service-name> 查最近日志。
常见卡点:
– 配置文件语法错误(比如 nginx.conf 多了个分号,systemd 不报错但服务拒绝加载)
– 依赖路径不存在(如 WorkingDirectory=/var/lib/myapp 但目录没 mkdir + chown)
– 端口被占(ss -tuln | grep :8080 比 netstat 更快更准)
– 用户权限不足(user=www-data 却试图读取 /root/secrets.json)
systemctl restart 后服务秒退,journalctl 里只有 Started ... 没有 Starting ...
这说明服务进程启动后立刻退出,systemd 连日志都来不及刷全。关键要看 ExecStart= 命令是否带了 -d(后台守护)或 --daemon 类参数——这些和 Type=simple 冲突,会导致 systemd 误判进程已死。
实操建议:
– 先临时把 service 文件里的 Type= 改成 forking(仅测试用)
– 更稳妥的是删掉启动命令里的后台参数,让进程前台运行(例如把 redis-server /etc/redis.conf 改成 redis-server /etc/redis.conf --daemonize no)
– 检查 Restart= 设置:默认是 no,可临时加 Restart=on-failure + RestartSec=5 方便观察反复崩溃
服务明明在跑,但端口不监听、curl 返回 connection refused
不是所有“active (running)”都等于“可用”。systemctl 只管进程是否存在,不管它有没有真正初始化完网络栈。
请注意以下说明:1、本程序允许任何人免费使用。2、本程序采用PHP+MYSQL架构编写。并且经过ZEND加密,所以运行环境需要有ZEND引擎支持。3、需要售后服务的,请与本作者联系,联系方式见下方。4、本程序还可以与您的网站想整合,可以实现用户在线服务功能,可以让客户管理自己的信息,可以查询自己的订单状况。以及返点信息等相关客户利益的信息。这个功能可提高客户的向心度。安装方法:1、解压本系统,放在
排查顺序:
– ss -tuln | grep :<port></port> 确认端口是否真在 LISTEN
– 如果没监听,检查服务配置里绑定地址是不是写死了 127.0.0.1(而你从外部访问)
– 检查防火墙:sudo ufw status 或 sudo iptables -L -n | grep <port></port>
– 对于 Go/Python 等语言写的程序,确认代码里没漏写 listen() 或 bind() 调用(常见于条件编译或环境变量未生效)
日志里反复出现 Failed to load environment files 或 Permission denied 权限问题
systemd 加载环境变量和读取配置比 shell 严格得多:它不会自动展开 ~,不继承用户 $HOME,且对文件权限执行 stat() 检查。
典型坑:
– EnvironmentFile=/home/deploy/app.env → 必须改成绝对路径,且 deploy 用户得对整个路径有 x 权限
– EnvironmentFile=-/etc/default/myapp 开头的 - 表示“文件不存在也不报错”,漏写会直接失败
– ReadWritePaths= 或 ProtectSystem= 等 sandbox 选项开启后,连 /tmp 都可能被限制写入
– 用 systemd-analyze verify <service>.service</service> 可提前发现语法和路径问题
真正的难点不在命令怎么敲,而在 systemd 的“状态”和“可用性”之间存在一层隐式契约——它只保证进程活着,不保证逻辑就绪。很多故障卡在中间态:进程 PID 存在、端口没开、健康检查超时、日志静默。这时候不能只盯 status,得用 ss、strace -p、lsof -p 穿插验证,否则永远在重启和等待之间打转。









