Linux:虚拟文件系统/proc和self进程

相关阅读

Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm=1001.2014.3001.5482


/proc目录

在Linux操作系统中,目录/proc是一个虚拟文件系统,称为procfc,用于访问内核和系统的实时状态信息。这个文件系统不同于常规文件系统,因为它并不存储在磁盘上,而是动态生成的。它的内容反映了当前系统的内核状态和运行中的进程信息,主要用于系统管理和调试。

每个正在运行的进程,都会在目录/proc下用一个子目录表示,目录名为进程的id号,例如,子目录/proc/1234会包含id号为1234的进程的相关信息。当一个进程创建时,操作系统会为其分配一个未使用的id号并在目录/proc下创建相应的目录;当一个进程执行完毕退出时,操作系统会删除相应的目录并回收id号。

例1已一个后台运行的sleep命令说明了上述过程。

bash 复制代码
# 例1
[zhangchen@EDA ~]$ sleep 10 & # 一个后台执行的测试命令
[1] 4533
[zhangchen@EDA ~]$ ls -al /proc
***
dr-xr-xr-x. 9 zhangchen zhangchen 0 Sep 20 20:27 4533
***
# 等待10秒后
[zhangchen@EDA ~]$ ls -al /proc/4533
ls: cannot access /proc/4533: No such file or directory

在sleep命令执行后,目录/proc下多出了一个名为4533的子目录,而在10秒后sleep命令执行完毕,此时名为4533的子目录消失了(前提是此时操作系统没有将id号4533其分配给其他进程)。

例2展示了使用ls命令来显示Bash进程目录下的内容以及它们的简介。

bash 复制代码
# 例2
[zhangchen@EDA ~]$ ps # 查询Bash进程的id号
   PID TTY          TIME CMD
  4934 pts/0    00:00:00 bash
  6192 pts/0    00:00:00 ps
[zhangchen@EDA ~]$ ls -al /proc/4934 # 显示虚拟文件系统中Bash进程目录
total 0
dr-xr-xr-x.   9 zhangchen zhangchen 0 Sep 20 20:30 .
dr-xr-xr-x. 385 root      root      0 Sep 20 20:22 ..
dr-xr-xr-x.   2 zhangchen zhangchen 0 Sep 20 20:37 attr # 包含与进程相关的属性(如安全属性)
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 autogroup # 显示进程的自动调度组信息,用于CPU调度优化
-r--------.   1 zhangchen zhangchen 0 Sep 20 20:37 auxv # 包含传递给进程的辅助向量,描述了进程运行时的环境
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 cgroup # 显示该进程所属的控制组(cgroup),用于资源控制
--w-------.   1 zhangchen zhangchen 0 Sep 20 20:37 clear_refs # 用于清除内存页的引用计数,主要用于内存分析
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:30 cmdline # 包含进程启动时的命令行参数
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 comm # 显示进程的简短名称(通常是执行的命令名)
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 coredump_filter # 控制生成核心转储时包含的内存段
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 cpuset # 显示进程的CPU集设置,用于控制该进程在哪些CPU上运行
lrwxrwxrwx.   1 zhangchen zhangchen 0 Sep 20 20:37 cwd -> /home/zhangchen # 一个指向该进程的当前工作目录的符号链接
-r--------.   1 zhangchen zhangchen 0 Sep 20 20:37 environ # 包含进程的环境变量信息
lrwxrwxrwx.   1 zhangchen zhangchen 0 Sep 20 20:30 exe -> /usr/bin/bash # 一个指向正在执行的可执行文件的路径
dr-x------.   2 zhangchen zhangchen 0 Sep 20 20:30 fd # 包含进程打开的文件描述符的符号链接,指向相应的资源
dr-x------.   2 zhangchen zhangchen 0 Sep 20 20:37 fdinfo # 目录提供与文件描述符相关的详细信息
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 gid_map # 显示进程的组ID映射,用于用户命名空间
-r--------.   1 zhangchen zhangchen 0 Sep 20 20:37 io # 显示与该进程相关的I/O统计信息,例如读取和写入的字节数
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 limits # 包含该进程的资源限制(如文件大小、内存限制等)
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 loginuid # 显示登录用户的UID,用于审计
dr-x------.   2 zhangchen zhangchen 0 Sep 20 20:37 map_files # 包含该进程内存映射的文件
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 maps # 显示进程的内存映射,包含所有加载到进程地址空间的文件和库
-rw-------.   1 zhangchen zhangchen 0 Sep 20 20:37 mem # 显示该进程的虚拟内存信息
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 mountinfo # 提供关于进程挂载点的详细信息
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 mounts # 提供进程的挂载点信息,但它的输出格式较为简洁
-r--------.   1 zhangchen zhangchen 0 Sep 20 20:37 mountstats # 提供进程挂载点的性能统计信息
dr-xr-xr-x.   6 zhangchen zhangchen 0 Sep 20 20:37 net # 包含进程的网络相关信息
dr-x--x--x.   2 zhangchen zhangchen 0 Sep 20 20:37 ns # 提供与进程相关的命名空间信息,如网络、PID 和 UTS 等命名空间
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 numa_maps # 显示进程的NUMA(非一致性内存访问)节点分配
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 oom_adj # 控制进程被OOM killer(内存不足杀手)选择的优先级。
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 oom_score # 显示该进程的OOM killer分数
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 oom_score_adj # 控制进程被OOM killer(内存不足杀手)选择的优先级。
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 pagemap # 提供与进程页表相关的详细信息
-r--------.   1 zhangchen zhangchen 0 Sep 20 20:37 patch_state # 跟踪补丁应用状态
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 personality # 显示和设置进程的执行环境("个性")参数
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 projid_map # 显示进程的项目ID映射
lrwxrwxrwx.   1 zhangchen zhangchen 0 Sep 20 20:37 root -> / # 该进程的根目录符号链接。通常指向/
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 sched # 提供该进程的调度信息,包括调度统计数据和相关状态
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 schedstat # 提供该进程的调度信息,包括调度统计数据和相关状态
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 sessionid # 显示进程的会话ID
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 setgroups # 控制该进程是否可以设置新的组ID
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 smaps # 提供内存映射的详细信息,包括每个映射的大小和属性
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 stack # 显示该进程的内核堆栈信息
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:30 stat # 包含进程的详细状态信息(如CPU使用、进程状态等)
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 statm # 显示进程的内存使用情况
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:30 status # 提供进程的概述,包括 PID、状态、内存使用、权限等
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 syscall # 显示该进程当前正在调用的系统调用信息
dr-xr-xr-x.   3 zhangchen zhangchen 0 Sep 20 20:37 task # 包含该进程的所有线程的子目录,每个线程都有一个独立的目录,类似于/proc的结构
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 timers # 提供该进程的定时器信息
-rw-r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 uid_map # 显示进程的用户ID映射
-r--r--r--.   1 zhangchen zhangchen 0 Sep 20 20:37 wchan # 显示进程当前正在等待的内核函数的名称

链接文件cwd指向命令执行时的当前工作目录,但它一定是有效的当前工作目录呢?答案不然。可以进行一个小测试,比如首先使用cd命令进入一个目录然后删除它,此时执行的任何命令所创建的任何进程,都没有有效的当前工作目录,如例3所示(这是一个找茬的例子,一般不会发生)。

bash 复制代码
# 例3
[zhangchen@EDA ~]$ mkdir dir
[zhangchen@EDA ~]$ cd dir
[zhangchen@EDA dir]$ rm ~/dir
[zhangchen@EDA dir]$ sleep 20 &
[1] 12690
[zhangchen@EDA dir]$ ls /proc/12690/cwd -al
lrwxrwxrwx. 1 zhangchen zhangchen 0 Sep 21 00:26 /proc/12690/cwd -> /home/zhangchen/dir (deleted) # 在Redhat系统中,/proc/12690/cwd会被标红,/home/zhangchen/dir (deleted)会闪烁

self进程

/proc/self是一个链接文件,指向了当前进程的目录,也就是说如果使用ls -al /proc/self命令,则显示其指向的是进程ls的目录,因为访问目录/proc/self时ls进程正在执行,如例4所示。

bash 复制代码
# 例4
[zhangchen@EDA ~]$ ls -al /proc/self # 查询当前进程(即ls)的信息
lrwxrwxrwx. 1 root root 0 Sep 20 23:26 /proc/self -> 5256 # 指向了/proc/5256
[zhangchen@EDA ~]$ ls -al /proc/self # 查询当前进程(即ls)的信息
lrwxrwxrwx. 1 root root 0 Sep 20 23:26 /proc/self -> 5371 # 指向了/proc/5371
[zhangchen@EDA ~]$ ls -al /proc/self # 查询当前进程(即ls)的信息
lrwxrwxrwx. 1 root root 0 Sep 20 23:26 /proc/self -> 5434 # 指向了/proc/5434

从例4中可以看出 ,连续三次使用ls命令得到的结果是不同的,这是因为每次执行ls命令都会创建一个新的进程并分配给一个未使用的id号(它们可能相等,因为执行完毕后id号会被回收,但在该例中不相等)。

如果使用cd命令进入/proc/self,按上面的说法会进入cd进程目录,但它在命令执行完后就被删除了,这会导致第一小节说的无效当前工作目录的问题吗?例5是一个测试。

bash 复制代码
# 例5
[zhangchen@EDA ~]$ cd /proc/self
[zhangchen@EDA self]$ ls -al cwd exe
lrwxrwxrwx. 1 zhangchen zhangchen 0 Sep 21 00:48 cwd -> /proc/10354
lrwxrwxrwx. 1 zhangchen zhangchen 0 Sep 21 00:11 exe -> /usr/bin/bash

可以看出,当前工作目录是有效的,而链接文件exe指向的居然是Bash命令的路径!这其实是Bash的进程目录。这是因为对于一些内建命令,不会创建子进程执行,而是直接在当前Bash进程中执行,可以使用type来检测一个命令是否为内建命令,如例6所示。

bash 复制代码
# 例6
[zhangchen@EDA ~]$ type cd
cd is a shell builtin
相关推荐
眠修18 分钟前
Kuberrnetes 服务发布
linux·运维·服务器
好奇的菜鸟1 小时前
Docker 配置项详解与示例
运维·docker·容器
xcs194052 小时前
集运维 麒麟桌面版v10 sp1 2403 aarch64 离线java开发环境自动化安装
运维·自动化
BAOYUCompany2 小时前
暴雨服务器成功中标华中科技大学集成电路学院服务器采购项目
运维·服务器
超龄超能程序猿2 小时前
Bitvisse SSH Client 安装配置文档
运维·ssh·github
奈斯ing3 小时前
【Redis篇】数据库架构演进中Redis缓存的技术必然性—高并发场景下穿透、击穿、雪崩的体系化解决方案
运维·redis·缓存·数据库架构
鳄鱼皮坡3 小时前
仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器
运维·服务器
即将头秃的程序媛3 小时前
centos 7.9安装tomcat,并实现开机自启
linux·运维·centos
fangeqin3 小时前
ubuntu源码安装python3.13遇到Could not build the ssl module!解决方法
linux·python·ubuntu·openssl
小Mie不吃饭4 小时前
FastAPI 小白教程:从入门级到实战(源码教程)
运维·服务器