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

相关阅读

Linuxicon-default.png?t=O83Ahttps://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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1540825.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

java-----IDE(集成开发环境)

IDE(集成开发环境) IDE(集成开发环境)-IDEA IDEA 介绍 1) IDEA 全称 IntelliJ IDEA2) 在业界被公认为最好的Java开发工具3) IDEA是JetBrains 公司的产品,总部位于捷克的首都布拉格4) 除了支持Java开发,还…

国标GB28181视频融合监控汇聚平台的方案实现及场景应用

Liveweb国标视频融合云平台基于端-边-云一体化架构,部署轻量简单、功能灵活多样,平台可支持多协议(GB28181/RTSP/Onvif/海康SDK/Ehome/大华SDK/RTMP推流等)、多类型设备接入(IPC/NVR/监控平台),在视频能力上&#xff0…

Cloudera安装不再复杂:基础环境设置详解

Cloudera Manager是CDH市场领先的管理平台。它以其强大的数据管理和分析能力,帮助企业能够轻松驾驭海量数据,实现数据的实时分析与洞察。 作为业界第一的端到端 Apache Hadoop 的管理应用,Cloudera Manager对CDH的每个部件都提供了细粒度的可…

我与Linux的爱恋:进程优先级|进程切换

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:Linux的学习 文章目录 1.进程优先级1.什么是进程优先级?2.进程优先级的类型3.进程优先级的作用4.进程优先级的实现5.进程优先级的重要性6.查看系统进程7.修改进程优先级8.优先…

mysql笔记—sql性能分析

1.查看数据库各个语句的执行频次 show global/session status like ‘com__’ 2.慢查询 默认没有开启,需要手动开启(在/etc/my.cnf中开启) 开启后在localhost-slow.log中可以查询到慢查询的语句的相关信息: 3.explain 用法&…

Java 在 GIS 领域的学习路线?

Java是一门广泛应用于企业级开发的编程语言,而GIS则是一种常用于地理信息处理和分析的技术。将Java与GIS结合起来,可以在企业级应用中实现更多的功能和业务需求,且在实际领域越来越广泛。 Java在GIS中重要的作用 1、跨平台性 Java具有跨平台…

康佳集团的多元化战略:创新还是负担?

2023年,康佳集团豪赌“一轴两轮三驱动”战略,企图以消费电子和半导体为马,来驱动业绩的快车,但2024年的半年报如同一盆冷水,让所有期望化为泡影。 财报显示,康佳上半年营业总收入只有54.13亿元&#xff0c…

ActivityManagerService Activity的启动流程(2)

ActivityManagerService Activity的启动流程 简述 提到ActivityManagerService,最重要的流程之一就是启动Activity了。 这个流程比较复杂: 启动activity的调用链很长。业务逻辑很多,activity启动有很多flag,例如FLAG_ACTIVITY_…

激活Clion2024.2报错We could not validate your license解决

网上激活方法后报错We could not validate your license HLLIQN9GJ8. 只需要设置代理: 主机名:localhost 端口号:80 不为以下设置代理:*.github.com,plugins.jetbrains.com 然后重新激活就不会提示了。

mac安装JetBtains全家桶新版本时报错:Cannot start the IDE

mac安装JetBtains全家桶新版本时报错:Cannot start the IDE 前言报错信息解决方法 前言 作者使用的是Mac电脑,最近想要更新JetBrains相关工具的软件版本,但是在安装时突然报错,导致安装失败,现在将报错信息以及解决方…

FB FC里调用全局变量注意事项

PLC编程基础之数据类型、变量声明、全局变量和I/O映射 PLC编程基础之数据类型、变量声明、全局变量和I/O映射(CODESYS篇 )_codesys全局变量如何映射写入-CSDN博客文章浏览阅读6.3k次,点赞2次,收藏4次。本文介绍了CODESYS编程的基础知识,包括数据类型、变量声明、全局变量、…

口罩检测、未戴口罩识别、未戴口罩检测算法

不戴口罩检测算法主要用于疫情防控、公共安全和企业管理等领域,通过图像识别技术来检测人群中的个体是否佩戴了口罩。这种技术可以帮助管理者实时监控人群的口罩佩戴情况,确保公共卫生安全和防疫措施的落实。以下是关于不戴口罩检测算法的应用场景等详细…

JVM 调优篇8 调优案例5- 逃逸分析

一 逃逸分析 1.1 概念 逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,对象只在方法内部使用,则认为没有发生逃逸。当一个对象在方法中被定义后,它被外部方法所引用,则认为发生逃逸。例如作为…

聊聊Thread Local Storage

聊聊ThreadLocal 为什么需要Thread Local StorageThread Local Storage的实现PThread库实现操作系统实现GCC __thread关键字实现C11 thread_local实现JAVA ThreadLocal实现 Thread Local Storage 线程局部存储,简称TLS。 为什么需要Thread Local Storage 变量分为全…

ubuntu中Python解释器位置

在Ubuntu系统中,Python解释器通常位于/usr/bin/python或者/usr/bin/python3。 ls /usr/bin/python* 你查python版本可能不是3.10 但是你程序使用如下解释器配置即可运行访问 #!/usr/bin/python3.10 #-*- coding:UTF-8 -*-

前端vue-ref与document.querySelector的对比

ref只在本组件中查找,而document.querySelector是在整个页面查找

一文说清楚ETL与Kafka如何实现集成

ETL与Kafka为何需要集成? 随着企业对实时流数据的处理要求越来越高,很多企业都把实时流数(日志、实时CDC采集数据、设备数据…)先推入到kafka中,再通过ETL对kafka中的数据进行消费通过ETL强大的数据的转换、清洗功能来进行数据的集成与分发。 实时数据…

Qt日志输出及QsLog日志库

目录 Qt日志输出及QsLog日志库日志输出格式化日志普通格式化条件格式化环境变量设置格式化日志输出位置日志输出对象信息禁用输出 QsLog日志库使用方法1. 将QsLog目录添加到项目中2. 配置CMakeLists.txt文件3. 配置.pro文件4. 日志记录器的配置5. 运行程序6. 启用行号和文件名C…

新通话,新突破!菊风荣获第七届“绽放杯”5G消息与新通话专题赛二等奖!

2024年9月9日,由中国信息通信研究院、中国通信企业协会主办的第七届“绽放杯”5G应用征集大赛5G消息及新通话专题赛决赛及颁奖仪式在西安富力希尔顿酒店成功举办。 PART 1 菊风荣获「绽放杯」二等奖 实力见证 荣耀加冕 经过初赛、复赛、决赛的层层选拔&#xff0c…

Prometheus - nVisual插件让运维更轻松

Prometheus 是一个开源的服务监控系统和时间序列数据库,常用于对基础设施的监控,监控范围涵盖了硬件层、操作系统层、中间件层、应用层等运维所需的所有监控指标类型,同时可利用第三方可视化工具Grafana实现时序数据的展示。然而,…