如何查看linux系统正运行的某个服务状态
以下是 3种实用方法+Python脚本,可直接查看Linux系统中特定服务的运行状态(适配Ubuntu等主流发行版):
一、核心命令(快速执行)
1. systemctl 命令(主流推荐,适用于 systemd 系统)
bash
格式:systemctl status [服务名]
systemctl status pulseaudio # 示例:查看音频服务
systemctl status nginx # 示例:查看Nginx服务
- 输出包含 运行状态(active/inactive)、PID、日志片段,红色 inactive 表示停止,绿色 active (running) 表示运行中。
2. service 命令(兼容旧系统,如 sysvinit)
bash
格式:service [服务名] status
service mysql status # 示例:查看MySQL服务
- ps 命令(直接查找进程,无服务名时可用)
bash
格式:ps -ef | grep [服务关键词]
ps -ef | grep pulseaudio # 示例:查找音频服务进程
ps -ef | grep python # 示例:查找Python相关进程
- 有输出结果且包含 pulseaudio (非 grep 自身),说明服务正在运行。
二、Python 脚本(批量检测/自动化场景)
以下是优化后的 Linux 服务状态检测脚本,支持单服务精准查询、多服务批量检测,输出清晰且包含进程详情,可直接运行:
python
!/usr/bin/env python3
import subprocess
import sys
from typing import Tuple, Optional
def run_system_command(cmd: list) -> Tuple[int, str, str]:
"""执行系统命令,返回状态码、stdout、stderr"""
try:
result = subprocess.run(
cmd, capture_output=True, text=True, timeout=10
)
return result.returncode, result.stdout.strip(), result.stderr.strip()
except subprocess.TimeoutExpired:
return 124, "", "命令执行超时"
except Exception as e:
return 125, "", f"命令执行失败:{str(e)}"
def get_service_status(service_name: str) -> dict:
"""获取单个服务的详细状态(基于 systemctl)"""
status_data = {
"service": service_name,
"is_running": False,
"status": "unknown",
"pid": None,
"description": "",
"error": ""
}
# 1. 优先使用 systemctl 检测(主流 systemd 系统)
code, stdout, stderr = run_system_command(["systemctl", "status", service_name])
if code == 0:
# 解析运行状态(active/inactive/failed)
for line in stdout.split("\n"):
line = line.strip()
if line.startswith("Active:"):
status_data["status"] = line.split(";", 1)[1].strip() if ";" in line else line.split()[1]
status_data["is_running"] = "active (running)" in line
elif line.startswith("Main PID:") and " " in line:
status_data["pid"] = line.split()[2]
elif line.startswith("Description:"):
status_data["description"] = line.split(":", 1)[1].strip()
elif "Unit {} not found".format(service_name) in stderr:
# 服务不存在,尝试用 ps 查找进程(非系统服务适用)
code_ps, stdout_ps, _ = run_system_command(["ps", "-ef", "|", "grep", "-v", "grep", "|", "grep", service_name])
if code_ps == 0 and stdout_ps:
status_data["is_running"] = True
status_data["status"] = "process running (not systemd service)"
# 提取第一个匹配进程的 PID
status_data["pid"] = stdout_ps.split()[1]
else:
status_data["error"] = "服务/进程不存在"
else:
status_data["error"] = stderr or "未知错误"
return status_data
def print_service_status(status_data: dict) -> None:
"""格式化输出服务状态"""
service = status_data["service"]
print(f"\n=== 服务状态:{service} ===")
if status_data["error"]:
print(f"❌ 错误:{status_data['error']}")
return
print(f"📊 运行状态:{'✅ 正在运行' if status_data['is_running'] else '❌ 已停止'}")
print(f"🔍 详细状态:{status_data['status']}")
if status_data["pid"]:
print(f"🆔 PID:{status_data['pid']}")
if status_data["description"]:
print(f"ℹ️ 描述:{status_data['description']}")
def main():
# 检查参数(必须传入服务名)
if len(sys.argv) < 2:
print("用法:")
print(f" 单服务查询:{sys.argv[0]} <服务名>")
print(f" 多服务查询:{sys.argv[0]} <服务1> <服务2> ...")
print("示例:")
print(f" {sys.argv[0]} pulseaudio nginx mysql")
sys.exit(1)
# 批量检测传入的所有服务
service_names = sys.argv[1:]
for service in service_names:
status = get_service_status(service)
print_service_status(status)
print("\n=== 检测完成 ===")
if name == "__main__":
main()
使用方法:
1. 保存脚本为 check_service.py
2. 赋予执行权限: chmod +x check_service.py
3. 运行示例:
bash
单服务查询(如音频服务)
./check_service.py pulseaudio
多服务批量查询(如音频、Nginx、MySQL)
./check_service.py pulseaudio nginx mysql
核心功能:
- 自动兼容 systemd 服务和普通进程(如自定义 Python 服务)
- 输出包含「运行状态、PID、服务描述」等关键信息
- 支持多服务批量检测,适合自动化监控场景
- 错误提示清晰(如「服务不存在」「执行超时」)
需要添加「服务启动/停止控制」或「日志导出」功能吗?我可以帮你快速扩展脚本。