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命令说明了上述过程。
# 例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进程目录下的内容以及它们的简介。
# 例2
[zhangchen@EDA ~]$ ps # 查询Bash进程的id号PID TTY TIME CMD4934 pts/0 00:00:00 bash6192 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所示(这是一个找茬的例子,一般不会发生)。
# 例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所示。
# 例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是一个测试。
# 例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所示。
# 例6
[zhangchen@EDA ~]$ type cd
cd is a shell builtin