0

0

Linux查看进程详细信息的常用方法

P粉602998670

P粉602998670

发布时间:2025-09-06 11:02:02

|

279人浏览过

|

来源于php中文网

原创

答案:通过ps、top/htop查看进程状态,结合/proc文件系统、lsof和strace深入分析内存、文件、网络及系统调用。

linux查看进程详细信息的常用方法

在Linux系统里,想深入了解一个进程到底在干什么,光看个PID和CPU占用率可不够。我们通常会用到

ps
命令的各种组合来抓取静态快照,
top
htop
进行实时监控,而当你真的需要挖掘更深层、更细致的信息时,直接探索
/proc
文件系统,配合
lsof
strace
这类工具,才是深入分析的王道。它们能帮你揭示进程的内存使用、打开的文件、网络连接,甚至它正在进行的系统调用,让你对进程的“内心世界”一览无余。

解决方案

要查看Linux进程的详细信息,我们通常会组合使用几个核心工具,每个工具都有其擅长的领域。

首先,

ps
命令是获取进程快照的基础。最常用的莫过于
ps aux
ps -ef
。前者以BSD风格显示所有用户的进程,包括没有控制终端的进程,输出会包含USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMAND等。后者则是System V风格,输出字段略有不同,如UID, PID, PPID, C, STIME, TTY, TIME, CMD。如果你想看某个特定进程,比如知道PID是12345,可以直接
ps -p 12345 -o pid,ppid,user,cmd,%cpu,%mem,stat,start_time
-o
参数可以让你自定义输出字段,这在写脚本或者只关注特定信息时非常方便。

接着,对于实时监控,

top
htop
是不可或缺的。
top
提供了系统资源使用的动态视图,包括CPU、内存、交换空间以及各个进程的实时数据。它能让你快速发现哪些进程是CPU或内存的消耗大户。而
htop
则是一个增强版的
top
,用户界面更友好,支持鼠标操作,可以更方便地排序、过滤、搜索进程,甚至直接杀死进程。对我个人来说,
htop
的树状视图(F5)在理解进程父子关系时简直是神器,能让你一眼看出一个服务的所有子进程都在做什么。

但当你需要真正深入到进程的“内部”时,

/proc
文件系统就是你的宝藏。Linux为每个运行的进程在
/proc
目录下都创建了一个以其PID命名的子目录,比如
/proc/12345/
。这个目录包含了大量关于该进程的详细信息。

  • cmdline
    文件:进程启动时的完整命令行参数。
  • environ
    文件:进程的环境变量
  • cwd
    (current working directory):指向进程当前工作目录的符号链接。
  • exe
    :指向进程可执行文件的符号链接。
  • fd/
    目录:包含了进程所有打开的文件描述符,每个描述符都是一个指向实际文件或socket的符号链接。
  • io
    文件:进程的I/O统计信息,如读写字节数。
  • maps
    文件:进程的内存映射,包括代码段、数据段、堆、栈以及加载的共享库。
  • status
    文件:包含了进程的各种状态信息,如内存使用(VmSize, VmRSS)、UID/GID、线程数等。
  • stat
    文件:更底层的进程状态数据,常用于编程解析。

例如,要查看PID为12345的进程的环境变量,你可以

cat /proc/12345/environ | tr '\0' '\n'
,因为环境变量是以null字符分隔的。查看它打开的文件描述符,则是
ls -l /proc/12345/fd
。这些文件和目录提供了最原始、最细致的进程信息。

最后,

lsof
(list open files)和
strace
是两个非常强大的辅助工具。
lsof -p PID
能列出指定进程打开的所有文件和网络连接,这对于诊断“文件句柄耗尽”或“端口被占用”问题非常有用。
strace -p PID
则可以跟踪一个进程正在进行的系统调用,这对于调试进程为何挂起、崩溃或行为异常时,提供了近乎“透视”的能力。你会看到进程与内核交互的每一个细节,比如它在读写哪个文件、尝试连接哪个网络地址、等待哪个信号等等。

如何深入分析Linux进程的内存使用情况?

要深入分析Linux进程的内存使用,仅仅看

top
ps
里显示的
VSZ
虚拟内存大小)和
RSS
(常驻内存大小)是远远不够的,它们只是一个概览。我们真正需要的是更细致的分类和映射信息。

首先,

ps -p PID -o pid,rss,vsz,%mem
可以提供一个基本的常驻内存和虚拟内存的视图。但更详细的信息存在于
/proc//status
/proc//maps
这两个文件中。

/proc//status
文件包含了进程的各种内存指标:

  • VmSize
    :进程的总虚拟内存大小。
  • VmRSS
    :进程的常驻内存大小(物理内存中实际占用的部分)。
  • VmData
    :数据段的大小。
  • VmStk
    :栈的大小。
  • VmExe
    :可执行代码的大小。
  • VmLib
    :加载的共享库的大小。
  • VmSwap
    :交换空间中使用的大小。

通过

grep 'Vm' /proc//status
,你就能看到这些详细的内存分类。这对于理解进程的内存构成非常有帮助。

ASP.NET 4.0电子商城
ASP.NET 4.0电子商城

在现实生活中的购物过程,购物者需要先到商场,找到指定的产品柜台下,查看产品实体以及标价信息,如果产品合适,就将该产品放到购物车中,到收款处付款结算。电子商务网站通过虚拟网页的形式在计算机上摸拟了整个过程,首先电子商务设计人员将产品信息分类显示在网页上,用户查看网页上的产品信息,当用户看到了中意的产品后,可以将该产品添加到购物车,最后使用网上支付工具进行结算,而货物将由公司通过快递等方式发送给购物者

下载

更进一步,

/proc//maps
文件则列出了进程所有的内存映射。这个文件会显示每一块内存区域的起始地址、结束地址、权限(读/写/执行)、偏移量以及对应的文件(如果是文件映射)。 例如,你会看到类似这样的行:
7f0000000000-7f0000010000 r-xp 00000000 08:01 12345 /usr/lib/libc.so.6
这表示
libc.so.6
库的一部分被映射到了进程的虚拟地址空间,具有读和执行权限。通过分析这个文件,你可以知道进程加载了哪些库、堆和栈的位置在哪里、是否有匿名映射(通常是动态分配的内存),甚至可以发现一些异常的内存区域。

此外,

pmap -x PID
命令可以提供一个更易读的内存映射概览,它会聚合
/proc//maps
的信息,并计算出每个映射区域的总大小,方便你快速识别哪些模块或区域占用了大量内存。对我来说,当怀疑内存泄漏或者想优化内存占用时,结合
status
maps
文件,再用
pmap
做个汇总,基本就能把进程的内存布局摸个透彻了。

进程为什么会卡住或无响应?如何诊断?

进程卡住或无响应是Linux系统管理员和开发者经常遇到的问题。诊断这类问题需要一套系统的排查方法,因为原因可能多种多样,从CPU资源耗尽到I/O等待,再到死锁或系统调用阻塞。

首先,我会用

top
htop
快速查看进程的
stat
(状态)字段。如果看到
D
(uninterruptible sleep,不可中断睡眠),这通常意味着进程正在等待I/O操作完成,比如磁盘读写、网络请求或者与硬件设备的交互。这种状态下的进程是无法被
kill -9
杀死的,因为它在内核态等待,必须等到I/O完成或设备响应。

如果

stat
R
(running)或
S
(sleeping),但进程没有响应,我会检查它的CPU使用率。如果CPU使用率很高(接近100%),那可能是进程陷入了无限循环或者正在执行非常耗时的计算。如果CPU使用率很低甚至为0,那它很可能是在等待某个资源、锁,或者被某个系统调用阻塞了。

这时,

strace -p PID
就成了我的杀手锏。通过跟踪进程的系统调用,你可以看到它在尝试做什么,以及它卡在了哪个系统调用上。

  • 如果看到大量的
    futex()
    调用,可能意味着进程在等待某个互斥锁或条件变量,这暗示着多线程程序可能存在死锁或竞争条件。
  • 如果看到
    read()
    write()
    调用长时间没有返回,那可能是文件I/O慢,或者网络连接阻塞。
  • 如果看到
    select()
    poll()
    epoll_wait()
    长时间等待,那说明进程在等待文件描述符上的事件(如网络数据到达)。

同时,

lsof -p PID
可以帮助你检查进程打开了哪些文件或网络连接。一个进程如果卡在等待网络响应上,
lsof
会显示它打开的socket连接状态,比如是
ESTABLISHED
但没有数据传输,或者
SYN_SENT
长时间未收到响应。如果它在等待一个文件锁,
lsof
也可能会给出线索。

另外,如果系统整体I/O负载很高,

iostat
命令可以帮助你判断是否是磁盘I/O瓶颈导致进程卡顿。
iostat -x 1
会显示各个磁盘设备的I/O利用率、队列长度等信息。

综合来看,诊断一个卡住的进程,就像侦探破案。我通常的流程是:

top/htop
看状态 ->
strace
看系统调用 ->
lsof
看资源占用 ->
iostat
看系统I/O。一步步缩小范围,最终定位问题所在。

如何追踪进程打开的文件和网络连接?

追踪进程打开的文件和网络连接,是诊断资源泄露、端口占用、文件锁死以及网络通信问题时的关键步骤。在Linux中,主要有

lsof
命令和
/proc
文件系统两种方式来实现。

lsof
(list open files)无疑是追踪进程打开文件和网络连接的瑞士军刀。它的功能非常强大且灵活。 要查看特定进程(例如PID为12345)打开的所有文件和网络连接,命令很简单:
lsof -p 12345
输出会包含以下关键信息:

  • COMMAND
    :进程的命令名。
  • PID
    :进程ID。
  • USER
    :进程所有者。
  • FD
    :文件描述符。这可能是数字(如
    0
    表示标准输入,
    1
    表示标准输出,
    2
    表示标准错误),也可以是
    cwd
    (当前工作目录)、
    txt
    (程序代码)、
    mem
    (内存映射文件)、`
    数字
    u
    (普通文件)或
    数字
    w
    (普通文件,可写)。
  • TYPE
    :文件类型,如
    REG
    (普通文件)、
    DIR
    (目录)、
    CHR
    (字符设备)、
    FIFO
    (命名管道)、
    SOCK
    (socket)等。
  • DEVICE
    :设备号。
  • SIZE/OFF
    :文件大小或文件偏移量。
  • NODE
    :文件系统节点号。
  • NAME
    :文件的完整路径或网络连接的详细信息。

如果只关注网络连接,可以加上

-i
参数:
lsof -i -p 12345
这会列出该进程所有的IPv4和IPv6网络连接,包括监听端口(
LISTEN
)、已建立的连接(
ESTABLISHED
)、等待连接(
TIME_WAIT
)等状态。你还可以进一步过滤,比如
lsof -i :80
可以找出所有占用80端口的进程。

除了

lsof
/proc
文件系统也提供了原始数据。每个进程的
/proc//fd/
目录包含了该进程所有打开的文件描述符。这些文件描述符实际上是指向实际文件或socket的符号链接。 通过
ls -l /proc/12345/fd
,你可以看到每个文件描述符指向的具体资源。例如:
lrwx------ 1 user user 64 Jan 1 10:00 3 -> /var/log/myapp.log
lrwx------ 1 user user 64 Jan 1 10:00 4 -> socket:[123456]
这里,
3
号文件描述符指向了一个日志文件,而
4
号文件描述符指向了一个socket。对于socket,你可能需要结合
netstat -tulnp
ss -tulnp
命令来进一步查看
socket:[inode]
对应的网络连接详情。

对我来说,

lsof
通常是首选,因为它输出的信息更聚合、更易读。但如果遇到
lsof
无法解析的特殊情况,或者需要编写脚本来自动化分析,那么直接操作
/proc//fd
目录,配合
/proc//net/
目录下的
tcp
udp
等文件,就能获取到最底层、最细致的信息了。这种组合拳基本能解决所有关于进程文件和网络资源占用的问题。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

232

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

437

2024.03.01

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

392

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

572

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

392

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

572

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

481

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

143

2025.12.24

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.5万人学习

Git 教程
Git 教程

共21课时 | 2.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号