在许多类
Unix计算机系统中,procfs(processes file system)是一种基于内存的虚拟文件系统,系统启动时挂载在/proc目录下。用于通过内核访问进程信息。
介绍
- proc 文件系统主要是用来调试内核
- proc 文件系统是一种内核和内核模块用来向
进程(process)发送信息的机制,因此被称为 proc - proc 是一种伪文件系统(也称虚拟文件系统),只存在于内存中
相关文件
/proc/PID/cmdline启动该进程的命令行/proc/PID/cwd当前工作目录的符号链接/proc/PID/environ影响进程的环境变量的名字和值/proc/PID/exe最初的可执行文件的符号链接,如果它还存在的话/proc/PID/fd一个目录,包含每个打开的文件描述符的符号链接/proc/PID/fdinfo一个目录,包含每个打开的文件描述符的位置和标记/proc/PID/maps一个文本文件包含内存映射文件与块的信息/proc/PID/mem一个二进制图像(image)表示进程的虚拟内存,只能通过ptrace化进程访问/proc/PID/root该进程所能看到的根路径的符号链接。如果没有 chroot 监狱,那么进程的根路径是//proc/PID/status包含了进程的基本信息,包括运行状态、内存使用。/proc/PID/task一个目录包含了硬链接到该进程启动的任何任务/proc/acpi或/proc/apm电源管理系统(如果有的话)对应的目录/proc/buddyinfo信息关于伙伴内存分配器用于处理内存碎片/proc/bus包含对应于计算机上各种总线的目录,如 input/PCI/USB. 在/sys/bus 下包含更丰富的信息。/proc/fb可利用的帧缓冲的列表/proc/cmdline传递给内核的启动选项。/proc/cpuinfo包含 CPU 信息,诸如厂商(vendor),型号 (family,model,model names),速度,缓存大小,逻辑核数 ,物理核数,CPU flags,以及 BogoMips.对于多核 CPU,/proc/cpuinfo 的逻辑核数"siblings"与物理核数"cpu cores"分别表示/proc/crypto可利用的加密模块列表/proc/devices字符设备与块设备列表,按照设备 ID 排序,但给出了/dev 名字的主要部分/proc/diskstats给出了每一块逻辑磁盘设备的一些信息/proc/filesystems当前时刻内核支持的文件系统的列表/proc/interrupts,/proc/iomem,/proc/ioports,/proc/irq,设备的一些与中断、内存访问有关的信息/proc/kmsg用于跟踪读取内核消息/proc/meminfo包含内核管理内存的一些汇总信息/proc/modules是/proc 最重要的文件之一,包含了当前加载的内核模块列表/proc/mounts包含了当前安装设备及安装点的符号链接/proc/net/一个目录包含了当前网络栈的信息,特别是/proc/net/nf_conntrack列出了存在的网络连接(对跟踪路由特别有用,因为 iptables 转发被用于重定向网络连接)/proc/partitions一个设备号、尺寸与/dev 名的列表,内核用于辨别已存在的硬盘分区/proc/scsi给出任何通过 SCSI 或 RAID 控制器挂接的设备的信息/proc/self(即/proc/PID/其中进程 ID 是当前进程的) 为当前进程的符号链接/proc/slabinfoLinux 内核频繁使用的对象的统计信息/proc/swaps活动交换分区的信息,如尺寸、优先级等。/proc/sys,动态可配置的内核选项. 其下的目录对应与内核区域,包含了可读与可写的虚拟文件(virtual file)/proc/sysvipc包括共享内存与进程间通信 (IPC)信息/proc/tty包含当前终端信息; /proc/tty/driver 是可利用的 tty 类型列表,其中的每一个是该类型的可用设备列表。/proc/uptime内核启动后经过的秒数与 idle 模式的秒数/proc/version包含 Linux 内核版本,发布号(distribution number),编译内核的 gcc 版本,其他相关的版本/proc/dma显示当前使用的 dma 通道/proc/kcore系统物理内存映像。与物理内存大小完全一样,然而实际上没有占用这么多内存;它仅仅是在程序访问它时才被创建/proc/loadavg系统“平均负载”; 3 个没有意义的指示器指出系统当前的工作量。/proc/self存放到查看/proc 的程序的进程目录的符号连接。当 2 个进程查看/proc 时,这将会是不同的连接。这主要便于程序得到它自己的进程目录。/proc/stat系统的不同状态,例如,系统启动后页面发生错误的次数。
/proc/xxx/cmdline 命令还原
还原 /proc/xxx/cmdline 中的命令主要依赖于一个关键点:命令和参数之间实际上是用空字节 (\0) 分隔的,而不是空格。
您看到的空格被删除了的现象,通常是因为直接用 cat 或文本编辑器查看该文件时,它们将这些空字节视为字符串的结束符或不可见字符,导致输出时参数粘连在一起,看起来就像空格被删了一样。
要还原为运行时的命令(包含正确的空格或分隔),您需要将文件内容中的空字节 (\0) 替换为普通的空格。
1. 使用 tr 命令(推荐)
tr 命令可以将输入中的字符进行替换。
tr '\0' ' ' < /proc/PID/cmdline\0:表示空字节(Null byte)。' ':表示一个空格。/proc/PID/cmdline:替换为实际的进程 ID(PID)。
示例:
假设 /proc/1234/cmdline 文件的内容是 bash\0-c\0echo hello world\0。
执行 tr '\0' ' ' < /proc/1234/cmdline 的结果会是:
bash -c echo hello world注意,末尾通常会多一个空格,因为它替换了最后一个参数后的 \0。
2. 使用 xargs 命令
xargs 默认以空字节作为分隔符读取输入,可以用来将参数列表重新组合成一行,但它可能会处理一些引号和转义字符,适用于直接执行:
xargs -0 echo < /proc/PID/cmdline-0:告诉xargs输入是用空字节 (\0) 分隔的。echo:用来将参数打印出来。
3. 使用 awk 或 sed
您也可以使用更复杂的文本处理工具,不过原理相似:
使用 awk:
awk -v RS='\0' '{$1=$1}1' /proc/PID/cmdline-v RS='\0':设置记录分隔符(Record Separator)为空字节。'{$1=$1}1':这个技巧用于强制awk重新计算和打印记录,从而使用默认的输出字段分隔符(一个空格)。