查看服务pid和状态需区分systemd与sysv init:systemd用systemctl status查整体状态及main pid,systemctl show --property=mainpid提取pid;通用方法用pgrep -f或ps aux | grep匹配进程名,并通过stat列判断r/s/z等状态。
要查看服务运行的进程id(pid)和状态,核心是区分“服务”在linux中对应的两种常见实现方式:传统sysv init脚本服务(如通过service管理)和现代systemd服务(主流发行版默认)。不同机制下,查pid和状态的方法不同,但目标一致:确认服务是否在运行、由哪些进程支撑、是否异常。
用systemctl查systemd服务的PID和状态
绝大多数较新系统(CentOS 7+/RHEL 8+、Ubuntu 16.04+、Debian 8+)使用systemd。这是最推荐、最标准的方式:
-
查服务整体状态(含主PID):
systemctl status 服务名,例如systemctl status nginx。输出中会明确显示Main PID:及其状态(running、exited、failed等),还附带最近日志片段。 -
只提取主PID(适合脚本调用):
systemctl show --property=MainPID --value 服务名,返回纯数字;若服务未运行,可能返回0或空。 -
查所有关联进程(含子进程):
systemctl show --property=ControlGroup 服务名获取cgroup路径,再配合ps --ppid或pgrep -g进一步筛选;更直接的是systemctl status 服务名后按Enter展开完整进程树(部分版本支持)。
用ps或pgrep按服务名查PID(通用、不依赖服务管理器)
当不确定服务管理类型,或需快速定位进程本身时,可跳过服务抽象层,直接查进程:
-
按进程名模糊查找:
pgrep -f "服务关键词",例如pgrep -f "redis-server"。-f选项匹配完整命令行,避免漏掉守护进程。 -
用ps结合grep(注意排除grep自身):
ps aux | grep "[r]edis-server"(方括号技巧让grep进程不被匹配)。 -
查进程状态字段:从
ps输出的STAT列看关键状态——R(运行中)、S(睡眠)、Z(僵尸,需处理)、(高优先级)等,结合%CPU/%MEM判断是否健康。
用pidof直接获取PID(简单快捷,适合脚本)
pidof专为“给名字返PID”设计,轻量高效:
-
pidof sshd:返回所有sshd进程的PID,空格分隔。 -
pidof -s nginx:只返回一个PID(常用于启动/停止脚本中取主进程)。 -
pidof -x backup.sh:加上-x才能查Shell脚本类服务(否则只认二进制程序)。 - 注意:若服务以非标准名启动(如Python脚本用
python3 app.py),pidof python3会返回大量无关进程,此时应优先用pgrep -f "app.py"。
验证服务是否真正可用,不止看PID
有PID不等于服务正常响应。建议组合验证:
- 对网络服务:用
ss -tlnp | grep :端口号确认端口已监听,且Netid列显示对应PID和服务名。 - 对本地服务:尝试发起一次简单请求,如
curl -I http://localhost(HTTP)或mysql -h127.0.0.1 -e "SELECT 1"(MySQL)。 - 检查日志:
journalctl -u 服务名 -n 20 --no-pager(systemd)或tail -n 20 /var/log/服务名.log(传统日志)。











