本文目录导读:

我来介绍几种获取进程信息的脚本方法,涵盖不同操作系统和需求场景:
Linux/Mac 系统脚本
Bash 脚本
#!/bin/bash # 获取所有进程信息 echo "=== 所有进程 ===" ps aux # 获取指定进程 echo "=== 查找特定进程 ===" ps aux | grep "python" # 按内存排序 echo "=== 按内存使用排序 ===" ps aux --sort=-%mem | head -20 # 按CPU使用排序 echo "=== 按CPU使用排序 ===" ps aux --sort=-%cpu | head -20 # 获取进程树 echo "=== 进程树 ===" pstree -p # 监控实时进程 echo "=== 实时进程监控 ===" top -b -n 1 # 获取进程详细信息 echo "=== PID 的详细信息 ===" pid=1234 ps -p $pid -o pid,user,command,%cpu,%mem,start,etime cat /proc/$pid/status cat /proc/$pid/cmdline # 获取网络连接情况 echo "=== 网络连接 ===" netstat -tunlp | grep $pid
高级 Bash 脚本
#!/bin/bash
# 获取进程信息的完整脚本
get_process_info() {
echo "=============================="
echo "进程信息报告"
echo "生成时间: $(date)"
echo "=============================="
# 进程总数
echo "进程总数: $(ps aux | wc -l)"
# 用户进程分布
echo -e "\n各用户进程数:"
ps aux | awk '{print $1}' | sort | uniq -c | sort -rn
# 内存使用TOP10
echo -e "\n内存使用TOP 10:"
ps aux --sort=-%mem | head -11 | tail -10
# CPU使用TOP10
echo -e "\nCPU使用TOP 10:"
ps aux --sort=-%cpu | head -11 | tail -10
# 僵尸进程
echo -e "\n僵尸进程:"
ps aux | awk '$8=="Z" {print $0}'
# 进程状态统计
echo -e "\n进程状态统计:"
ps aux | awk '{print $8}' | sort | uniq -c | sort -rn
}
get_specific_process() {
pattern=$1
echo "正在搜索: $pattern"
ps aux | grep "$pattern" | grep -v grep
}
get_process_tree() {
pid=$1
echo "进程 $pid 的父子关系:"
cmpid=$pid
# 向上追溯直至根进程
while [ $cmpid -ne 0 ]; do
info=$(ps -p $cmpid -o pid=,ppid=,comm=)
echo " $info"
cmpid=$(ps -p $cmpid -o ppid=)
# 防止死循环
if [ $cmpid -eq $pid ]; then
break
fi
done
}
# 主函数
case "$1" in
all)
get_process_info
;;
search)
get_specific_process "$2"
;;
tree)
get_process_tree "$2"
;;
*)
echo "用法: $0 {all|search <关键字>|tree <PID>}"
;;
esac
Python 脚本
使用 psutil 库
#!/usr/bin/env python3
import psutil
import os
import time
from datetime import datetime
class ProcessInfo:
def __init__(self):
self.processes = []
def get_all_processes(self):
"""获取所有进程信息"""
for proc in psutil.process_iter(['pid', 'name', 'username',
'cpu_percent', 'memory_percent',
'status', 'create_time', 'cmdline']):
try:
pinfo = proc.info
pinfo['create_time'] = datetime.fromtimestamp(
pinfo['create_time']
).strftime('%Y-%m-%d %H:%M:%S')
self.processes.append(pinfo)
except (psutil.NoSuchProcess, psutil.AccessDenied,
psutil.ZombieProcess):
continue
return self.processes
def get_process_detail(self, pid):
"""获取单个进程详细信息"""
try:
proc = psutil.Process(pid)
info = {
'pid': proc.pid,
'name': proc.name(),
'status': proc.status(),
'cpu_percent': proc.cpu_percent(interval=1),
'memory_percent': proc.memory_percent(),
'memory_rss': proc.memory_info().rss / (1024**2), # MB
'memory_vms': proc.memory_info().vms / (1024**2), # MB
'threads': len(proc.threads()),
'create_time': datetime.fromtimestamp(
proc.create_time()
).strftime('%Y-%m-%d %H:%M:%S'),
'cmdline': ' '.join(proc.cmdline()),
'username': proc.username(),
'connections': len(proc.connections()),
'open_files': len(proc.open_files())
}
return info
except psutil.NoSuchProcess:
return f"进程 {pid} 不存在"
except psutil.AccessDenied:
return f"没有权限访问进程 {pid}"
except Exception as e:
return f"错误: {e}"
def get_children_processes(self, pid):
"""获取子进程"""
try:
proc = psutil.Process(pid)
children = proc.children(recursive=True)
return [(child.pid, child.name()) for child in children]
except:
return []
def monitor_process(self, pid, interval=2, duration=10):
"""监控进程性能"""
print(f"开始监控进程 {pid},每 {interval} 秒采样一次,共 {duration} 秒")
proc = psutil.Process(pid)
samples = []
start_time = time.time()
while time.time() - start_time < duration:
try:
cpu_percent = proc.cpu_percent(interval=interval)
mem_percent = proc.memory_percent()
memory_mb = proc.memory_info().rss / (1024**2)
threads = proc.num_threads()
sample = {
'time': time.strftime('%H:%M:%S'),
'cpu': cpu_percent,
'memory': mem_percent,
'memory_mb': memory_mb,
'threads': threads
}
samples.append(sample)
print(f"时间: {sample['time']}, CPU: {sample['cpu']}%, "
f"内存: {sample['memory']:.2f}%, "
f"RSS: {sample['memory_mb']:.1f}MB, "
f"线程: {sample['threads']}")
except Exception as e:
print(f"监控错误: {e}")
break
return samples
# 使用示例
if __name__ == "__main__":
pi = ProcessInfo()
# 获取所有进程
processes = pi.get_all_processes()
print(f"共有 {len(processes)} 个进程")
# 打印前10个
for proc in processes[:10]:
print(f"PID: {proc['pid']}, 名称: {proc['name']}, "
f"用户: {proc['username']}, CPU: {proc['cpu_percent']}%, "
f"内存: {proc['memory_percent']:.2f}%")
# 获取特定进程详情
pid = int(input("请输入PID查看详情: "))
print(pi.get_process_detail(pid))
# 获取子进程
print("子进程:", pi.get_children_processes(pid))
# 监控进程
pi.monitor_process(pid, interval=1, duration=5)
Windows 脚本
PowerShell 脚本
# 获取所有进程
Get-Process
# 按内存排序
Get-Process | Sort-Object -Property WorkingSet64 -Descending | Select-Object -First 10
# 查看特定进程
Get-Process -Name "chrome"
# 查看进程详细信息
Get-WmiObject Win32_Process | Select-Object Name, ProcessId, VirtualSize, WorkingSetSize
# 获取进程路径
Get-Process | Select-Object Name, Id, Path
# 实时监控
while ($true) {
Clear-Host
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 | Format-Table
Start-Sleep -Seconds 2
}
批处理脚本 (cmd)
@echo off :: 列出所有进程 tasklist :: 列出指定进程 tasklist /FI "IMAGENAME eq chrome.exe" :: 按内存排序 tasklist /FO CSV /NH > temp.csv type temp.csv | sort /R :: 获取进程详细信息 wmic process list full | findstr /i "Name=chrome.exe" :: 系统信息 systeminfo :: 资源使用 typeperf "\Process(*)\% Processor Time" /sc 2 pause
跨平台工具
使用 psutil 的 Python 脚本(跨平台)
import psutil
import json
def get_system_cross_platform():
"""跨平台获取进程信息"""
data = {
'os_name': psutil.os_name,
'cpu_count': psutil.cpu_count(),
'memory_percent': psutil.virtual_memory().percent,
'disk_usage': {},
'processes': []
}
# 磁盘使用
for disk in psutil.disk_partitions():
try:
usage = psutil.disk_usage(disk.mountpoint)
data['disk_usage'][disk.device] = {
'mount_point': disk.mountpoint,
'total': usage.total / (1024**3), # GB
'used': usage.used / (1024**3),
'free': usage.free / (1024**3),
'percent': usage.percent
}
except:
pass
# 进程信息
for proc in psutil.process_iter(['pid', 'name', 'cpu_percent']):
try:
data['processes'].append(proc.info)
except:
continue
return data
# 输出JSON格式
print(json.dumps(get_system_cross_platform(), indent=2))
监控和告警脚本
#!/usr/bin/env python3
import psutil
import smtplib
import os
from email.mime.text import MIMEText
class ProcessMonitor:
def __init__(self, threshold_cpu=80, threshold_mem=90):
self.threshold_cpu = threshold_cpu
self.threshold_mem = threshold_mem
self.alerts = []
def check_high_cpu_processes(self):
"""检查CPU使用率过高的进程"""
cpu_usage = psutil.cpu_percent(interval=1)
if cpu_usage > self.threshold_cpu:
self.alerts.append(f"系统CPU使用率过高: {cpu_usage}%")
for proc in psutil.process_iter(['pid', 'name', 'cpu_percent']):
if proc.info['cpu_percent'] and proc.info['cpu_percent'] > self.threshold_cpu:
self.alerts.append(
f"进程 {proc.info['name']} (PID:{proc.info['pid']}) "
f"CPU使用率: {proc.info['cpu_percent']}%"
)
def check_high_memory_processes(self):
"""检查内存使用率过高的进程"""
vm = psutil.virtual_memory()
if vm.percent > self.threshold_mem:
self.alerts.append(f"系统内存使用率过高: {vm.percent}%")
for proc in psutil.process_iter(['pid', 'name', 'memory_percent']):
if proc.info['memory_percent'] and proc.info['memory_percent'] > self.threshold_mem:
self.alerts.append(
f"进程 {proc.info['name']} (PID:{proc.info['pid']}) "
f"内存使用率: {proc.info['memory_percent']:.1f}%"
)
def check_process_count(self):
"""检查进程数量"""
process_count = len(list(psutil.process_iter()))
if process_count > 1000:
self.alerts.append(f"进程数量过多: {process_count}")
def generate_report(self):
"""生成监控报告"""
self.check_high_cpu_processes()
self.check_high_memory_processes()
self.check_process_count()
if self.alerts:
report = "\n".join(self.alerts)
print(f"[ALERT] {len(self.alerts)} 条告警:\n{report}")
# 可以在这里发送邮件
# self.send_email(report)
else:
print("[OK] 系统正常")
def send_email(self, message):
"""发送邮件告警(需配置)"""
# 邮件配置
msg = MIMEText(message)
msg['Subject'] = "系统进程告警"
msg['From'] = "monitor@example.com"
msg['To'] = "admin@example.com"
# smtp配置
try:
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login("your_email", "your_password")
server.send_message(msg)
server.quit()
except Exception as e:
print(f"发送邮件失败: {e}")
# 使用
if __name__ == "__main__":
monitor = ProcessMonitor(threshold_cpu=70, threshold_mem=80)
monitor.generate_report()
实用技巧
获取特定用户进程
# Linux
ps aux | grep "^username"
# Python
import psutil
users = psutil.users()
for user in users:
print(user.name)
端口与进程关联
# 查看谁在使用80端口 lsof -i :80 netstat -tulpn | grep 80
定期记录
# Cron任务定期记录进程信息 */5 * * * * /path/to/your_script.sh >> /var/log/process.log
这些脚本覆盖了大部分常见的进程信息获取需求,根据你的具体场景选择合适的方案,如果需要特定功能,我可以帮你完善。