怎么用脚本获取进程信息

wen 实用脚本 2

本文目录导读:

怎么用脚本获取进程信息

  1. Linux/Mac 系统脚本
  2. Python 脚本
  3. Windows 脚本
  4. 跨平台工具
  5. 监控和告警脚本
  6. 实用技巧

我来介绍几种获取进程信息的脚本方法,涵盖不同操作系统和需求场景:

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

这些脚本覆盖了大部分常见的进程信息获取需求,根据你的具体场景选择合适的方案,如果需要特定功能,我可以帮你完善。

抱歉,评论功能暂时关闭!