/proc文件系统与常用进程管理命令总结

来源:互联网 发布:js for循环给数组赋值 编辑:程序博客网 时间:2024/06/02 03:50

之前看APUE的时候,可能是APUE写的太早了,里面并没有涉及到/proc 文件系统。这个部分也就没有详细的去看和总结了,今天突然想到如果要查看CPU信息怎么办?当然是cat /proc/cpuinfo~于是便顺便关注了一下这个/proc。。。

/proc 文件系统

在一些比较老的UNIX系统中,通常并没有简单的方法来获取甚至修改内核的属性并告知用户一些系统和进程的信息。
一些老旧的UNIX系统会允许root权限的用户深入内核内存中的数据结构进行相关操作。。。这要求需要具备内核数据结构的专业知识。

/proc 文件系统提供了一个基于文件的Linux 内部接口。它可以用于确定系统的各种不同设备和进程的状态。对他们进行配置。因而,理解和应用有关这个文件系统的知识是理解你的Linux 系统的关键。

/proc — 一个虚拟文件系统

/proc 文件系统是一种内核和内核模块用来向进程(process) 发送信息的机制(所以叫做/proc)。这个伪文件系统让你可以和内核内部数据结构进行交互,获取有关进程的有用信息,在运行中(on the fly) 改变设置(通过改变内核参数)。
与其他文件系统不同,/proc 存在于内存之中而不是硬盘上。如果你察看文件/proc/mounts (和mount 命令一样列出所有已经加载的文件系统),键入 cat /proc/mounts | grep proc 你会看到其中 一行是这样的:

/proc /proc proc rw 0 0

/proc 由内核控制,没有承载/proc 的设备。因为/proc 主要存放由内核控制的状态信息,所以大部分这些信息的逻辑位置位于内核控制的内存。对/proc 进行一次’ls -al’ 可以看到大部分文件都是0 字节大的;不过察看这些文件的时候,确实可以看到一些信息。这怎么可能?这是因为/proc 文件系统和其他常规的文件系统一样把自己注册到虚拟文件系统层(VFS) 了。然而,直到当VFS 调用它,请求文件、目录的i-node 的时候,/proc 文件系统才根据内核中的信息建立相应的文件和目录。
简单来说:之所以把/proc文件系统称为虚拟,是因为其包含的文件和子目录并没有存储在磁盘上,而是由内核在进程访问此类信息时候动态创建而成的。

加载/proc 文件系统

如果系统中还没有加载proc 文件系统,可以通过如下命令加载proc 文件系统:

mount -t proc proc /proc

上述命令将成功加载你的proc 文件系统。更多细节请阅读mount 命令的man page。

查看/proc 文件

/proc 的文件可以用于访问有关内核的状态、计算机的属性、正在运行的进程的状态等信息。大部分/proc 中的文件和目录提供系统物理环境最新的信息。
尽管/proc 中的文件是虚拟的,但它们仍可以使用任何文件编辑器或像’more’, ‘less’或’cat’这样的程序来查看。当编辑程序试图打开一个虚拟文件时,这个文件就通过内核中的信息被凭空地(on the fly) 创建了。

lijiaheng@lijiaheng-N550JK:/proc$ls -l /proc/cpuinfo
-r–r–r– 1 root root 0 3月 7 14:31 /proc/cpuinfo
lijiaheng@lijiaheng-N550JK:/proc$ file /proc/cpuinfo
/proc/cpuinfo: empty
lijiaheng@lijiaheng-N550JK:/proc$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 60
model name : Intel(R) Core(TM) i7-4700HQ CPU @ 2.40GHz
stepping : 3
microcode : 0x17
cpu MHz : 2400.093
cache size : 6144 KB
physical id : 0
siblings : 8
core id : 0
cpu cores : 4

/proc 目录下的系统信息

proc 文件系统可以被用于收集有用的关于系统和运行中的内核的信息。

下面是一些重要的文件:

  • /proc/cpuinfo - CPU 的信息(型号, 家族, 缓存大小等)
  • /proc/meminfo - 物理内存、交换空间等的信息
  • /proc/mounts - 已加载的文件系统的列表
  • /proc/devices - 可用设备的列表
  • /proc/filesystems - 被支持的文件系统
  • /proc/modules - 已加载的模块
  • /proc/version - 内核版本
  • /proc/cmdline - 系统启动时输入的内核命令行参数

proc 中的文件远不止上面列出的这么多。想要进一步了解可以对/proc 的每一个文件都more一下获取更多的有关/proc 目录中的文件的信息。我建议使用more而不是cat,除非你知道这个文件很小,因为有些文件(比如kcore) 可能会非常长。

/proc/cmdline 文件

这个文件给出了内核启动的命令行。它和用于进程的cmdline 项非常相似。
示例:
[root@localhost proc]# cat cmdline
ro root=LABEL=/ rhgb quiet

/proc/cpuinfo 文件

这个文件提供了有关系统CPU 的多种信息。这些信息是从内核里对CPU 的测试代码中得到的。文件列出
了CPU 的普通型号 (386,486,586,686 等 ), 以及能得到的更多特定信息 ( 制造商, 型号和版本 )
文件还包含了以bogomips 表示的处理器速度, 而且如果检测到CPU 的多种特性或者bug, 文件还会包含相应的标志。这个文件的格式为:文件由多行构成, 每行包括一个域名称, 一个冒号和一个值。

/proc/devices 文件

这个文件列出字符和块设备的主设备号, 以及分配到这些设备号的设备名称。
lijiaheng@lijiaheng-N550JK:/proc$ cat devices
Character devices:
1 mem
4 /dev/vc/0
4 tty
4 ttyS
5 /dev/tty
5 /dev/console
5 /dev/ptmx
5 ttyprintk
6 lp
7 vcs
10 misc
13 input
21 sg
29 fb
81 video4linux
89 i2c
99 ppdev
108 ppp

Block devices:
1 ramdisk
259 blkext
7 loop
8 sd
9 md
11 sr

/proc/dma 文件

这个文件列出由驱动程序保留的DMA 通道和保留它们的驱动程序名称 。casade 项供用于把次DMA 控制器从主控制器分出的DMA 行所使用; 这一行不能用于其它用途。
示例:
[root@localhost ~]# cat /proc/dma
4: cascade

/proc/filesystems 文件

这个文件列出可供使用的文件系统类型, 一种类型一行 。 虽然它们通常是编入内核的文件系统类型, 但该文件还可以包含可加载的内核模块加入的其它文件系统类型。
示例:
lijiaheng@lijiaheng-N550JK:/proc$ cat filesystems
nodev sysfs
nodev rootfs
nodev ramfs
nodev bdev
nodev proc
nodev cpuset
nodev cgroup
nodev tmpfs
nodev devtmpfs

/proc/interrupts 文件

这个文件的每一行都有一个保留的中断 。 每行中的域有 :中断号, 本行中断的发生次数, 可能带有一个加号的域(SA_INTERRUPT 标志设置), 以及登记这个中断的驱动程序的名字。可以在安装新硬件前, 像查看/proc/dma 和/proc/ioports 一样用cat 命令手工查看手头的这个文件 。 这几个文件列出了当前投入使用的资源(但是不包括那些没有加载驱动程序的硬件所使用的资源 ) 。

/proc/ioports 文件

这个文件列出了诸如磁盘驱动器, 以太网卡和声卡设备等多种设备驱动程序登记的许多I/O 端口范围。
lijiaheng@lijiaheng-N550JK:/proc$ cat ioports
0000-0cf7 : PCI Bus 0000:00
0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0

/proc/kcore 文件

这个文件是系统的物理内存以core 文件格式保存的文件。例如,GDB 能用它考察内核的数据结构。它不是纯文本, 而是/proc 目录下为数不多的几个二进制格式的项之一。

/proc/kmsg 文件

这个文件用于检索用printk 生成的内核消息。任何时刻只能有一个具有超级用户权限的进程可以读取这个文件。也可以用系统调用syslog 检索这些消息。通常使用工具dmesg 或守护进程klogd 检索这些消息。

/proc/ksyms 文件

这个文件列出了已经登记的内核符号; 这些符号给出了变量或函数的地址 。 每行给出一个符号的地址, 符号名称以及登记这个符号的模块。程序ksyms,insmod 和kmod 使用这个文件。它还列出了正在运行的任务数,总任务数和最后分配的PID 。

/proc/loadavg 文件

这个文件给出以几个不同的时间间隔计算的系统平均负载, 这就如同uptime 命令显示的结果那样 。 前三个数字是平均负载 。 这是通过计算过去1 分钟,5 分钟,15 分钟里运行队列中的平均任务数得到的 。 随后是正在运行的任务数和总任务数。最后是上次使用的进程号。
示例:[root@localhost ~]# cat /proc/loadavg
0.11 0.16 0.14 3/126 3912

/proc/locks 文件

这个文件包含在打开的文件上的加锁信息。文件中的每一行描述了特定文件和文档上的加锁信息以及对文件施加的锁的类型。内核也可以需要时对文件施加强制性锁。

/proc/meminfo 文件

这个文件给出了内存状态的信息 。 它显示出系统中空闲内存, 已用物理内存和交换内存的总量 。 它还显示出
内核使用的共享内存和缓冲区总量。这些信息的格式和free 命令显示的结果类似。

/proc/modules 文件

这个文件给出可加载内核模块的信息 。lsmod 程序用这些信息显示有关模块的名称, 大小, 使用数目方面的信息。

/proc/stat 文件

这个文件包含的信息有CPU 利用率, 磁盘, 内存页, 内存对换, 全部中断, 接触开关以及赏赐自举时间(自1970年1 月1 日起的秒数 )

/proc/uptime 文件

这个文件给出自从上次系统自举以来的秒数, 以及其中有多少秒处于空闲 。 这主要供uptime 程序使用 。 比较这两个数字能够告诉你长期来看CPU 周期浪费的比例。
示例:
[root@localhost /]# cat /proc/uptime
4477.04 4021.10

/proc/version 文件

这个文件只有一行内容, 说明正在运行的内核版本。可以用标准的编程方法进行分析获得所需的系统信息。

一些重要的/proc子目录

目录 目录中文件表达信息 /proc/net 有关网络和套接字状态 /proc/sysvipc 有关System V IPC对象的信息 /proc/sys/fs 文件系统相关设置 /proc/sys/kernel 各种常规内核设置 /proc/sys/net 网络和套接字设置 /proc/sys/vm 内存管理设置
/proc/net 子目录

此目录下的文件描述或修改了联网代码的行为。可以通过使用 arp,netstat,route 和ipfwadm 命令设置或查询这些特殊文件中的许多文件。

以下摘要介绍此目录下文件的功能:

文件 功能 arp 转储每个网络接口的arp 表中dev 包的统计 dev 来自网络设备的统计 dev_mcast 列出二层(数据链路层)多播组 igmp 加入的IGMP 多播组 netlink netlink 套接口的信息 netstat 网络流量的多种统计。第一行是信息头, 带有每个变量的名称。接下来的一行保存相应变量的值 raw 原始套接口的套接口表 route 静态路由表 rpc 包含RPC 信息的目录rt_cache 路由缓冲 snmp snmp agent 的ip/icmp/tcp/udp 协议统计; 各行交替给出字段名和值 sockstat 列出使用的tcp/udp/raw/pac/syc_cookies 的数量 tcp TCP 连接的套接口 udp UDP 连接的套接口表 unix UNIX 域套接口的套接口表

有关运行中的进程的信息

/proc 文件系统可以用于获取运行中的进程的信息。在/proc 中有一些编号的子目录。每个编号的目录对应一个进程id (PID)。这样,每一个运行中的进程/proc 中都有一个用它的PID 命名的目录。这些子目录中包含可以提供有关进程的状态和环境的重要细节信息的文件。

$ ps -aef | grep mozilla
root 32558 32425 8 22:53 pts/1 00:01:23 /usr/bin/mozilla

上述命令显示有一个正在运行的mozilla 进程的PID 是32558。相对应的,/proc 中应该有一个名叫32558 的目录

$ ls -l /proc/32558
total 0
-r–r–r– 1 root root 0 Dec 25 22:59 cmdline
-r–r–r– 1 root root 0 Dec 25 22:59 cpu
lrwxrwxrwx 1 root root 0 Dec 25 22:59 cwd -> /proc/
-r——– 1 root root 0 Dec 25 22:59 environ
lrwxrwxrwx 1 root root 0 Dec 25 22:59 exe -> /usr/bin/mozilla*
dr-x—— 2 root root 0 Dec 25 22:59 fd/
-r–r–r– 1 root root 0 Dec 25 22:59 maps
-rw——- 1 root root 0 Dec 25 22:59 mem
-r–r–r– 1 root root 0 Dec 25 22:59 mounts
lrwxrwxrwx 1 root root 0 Dec 25 22:59 root -> //
-r–r–r– 1 root root 0 Dec 25 22:59 stat
-r–r–r– 1 root root 0 Dec 25 22:59 statm
-r–r–r– 1 root root 0 Dec 25 22:59 status

文件”cmdline” 包含启动进程时调用的命令行。”envir” 进程的环境变量。”status” 是进程的状态信息,包括启动进程的用户的用户ID (UID) 和组ID(GID) ,父进程ID (PPID),还有进程当前的状态,比如”Sleelping”和”Running”。每个进程的目录都有几个符号链接,”cwd”是指向进程当前工作目录的符号链接,”exe”指向运行的进程的可执行程序,”root”指向被这个进程看作是根目录的目录(通常是”/”)。目录”fd”包含指向进程使用的文件描述符的链接。”cpu”仅在运行SMP 内核时出现,里面是按CPU 划分的进程时间。

线程:/proc/PID/task目录
因为线程组中的一些属性对于线程而言是唯一的,所以用一个task子目录管理。
针对进程中每个线程,内核提供/proc/PID/task/TID命名的子目录,其中TID为线程ID。
每个/proc/PID/task/TID子目录中都有一套类似于/proc/PID目录内容的文件和目录。

/proc/self 是一个有趣的子目录,它使得程序可以方便地使用/proc 查找本进程地信息。/proc/self 是一个链接到/proc 中访问/proc 的进程所对应的PID 的目录的符号链接。

通过/proc 与内核交互

上面讨论的大部分/proc 的文件是只读的。而实际上/proc 文件系统通过/proc 中可读写的文件提供了对内核的交互机制。写这些文件可以改变内核的状态,因而要慎重改动这些文件。/proc/sys 目录存放所有可读写的文件的目录,可以被用于改变内核行为。

/proc/sys/kernel - 这个目录包含反通用内核行为的信息。/proc/sys/kernel/{domainname, hostname} 存放着机器/网络的域名和主机名。这些文件可以用于修改这些名字。

$ hostname
machinename.domainname.com
$ cat /proc/sys/kernel/domainname
domainname.com
$ cat /proc/sys/kernel/hostname
machinename
$ echo “new-machinename” > /proc/sys/kernel/hostname
$ hostname
new-machinename.domainname.com

这样,通过修改/proc 文件系统中的文件,我们可以修改主机名。很多其他可配置的文件存在于/proc/sys/kernel/。
另一个可配置的目录是/proc/sys/net。这个目录中的文件可以用于修改机器/网络的网络属性。比如,简单修改一个文件,你可以在网络上瘾藏匿的计算机。

$ echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

这将在网络上瘾藏你的机器,因为它不响应icmp_echo。主机将不会响应其他主机发出的ping 查询。

$ ping machinename.domainname.com
no answer from machinename.domainname.com

要改回缺省设置,只要

$ echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all

/proc/sys 下还有许多其它可以用于改变内核属性~~~有机会慢慢学习。。。


进程管理常用命令

  1. ps
    ps是Linux 中最基础的浏览系统中的进程的命令。能列出系统中运行的进程,包括进程号、命令、CPU使用量、内存使用量等。下述选项可以得到更多有用的消息。
    ps -a - 列出所有运行中/激活进程
    ps -ef |grep - 列出需要进程
    ps -aux - 显示进程信息,包括无终端的(x)和针对用户(u)的进程:如USER, PID, %CPU, %MEM等

  2. pstree
    linux中,每一个进程都是由其父进程创建的。此命令以可视化方式显示进程,通过显示进程的树状图来展示进程间关系。如果指定了pid了,那么树的根是该pid,不然将会是init(pid: 1)。

    lijiaheng@lijiaheng-N550JK:/$ pstree
    systemd─┬─ModemManager─┬─{gdbus}
    │ └─{gmain}
    ├─NetworkManager─┬─dhclient
    │ ├─dnsmasq
    │ ├─{gdbus}
    │ └─{gmain}
    ├─accounts-daemon─┬─{gdbus}
    │ └─{gmain}
    ├─acpid
    ├─agetty
    ├─avahi-daemon───avahi-daemon
    ├─bluetoothd
    ├─colord─┬─{gdbus}
    │ └─{gmain}
    ├─cron
    ├─cups-browsed─┬─{gdbus}
    │ └─{gmain}
    ├─dbus-daemon
    ├─fwupd─┬─3*[{GUsbEventThread}]
    │ ├─{fwupd}
    │ ├─{gdbus}
    │ └─{gmain}

  3. top
    top是一个更加有用的命令,可以监视系统中不同的进程所使用的资源。它提供实时的系统状态信息。显示进程的数据包括 PID、进程属主、优先级、%CPU、%memory等。可以使用这些显示指示出资源使用量。

  4. htop
    htop与top很类似,但是htop是交互式的文本模式的进程查看器。它通过文字图形化地显示每一个进程的CPU和内存使用量、swap使用量。使用上下光标键选择进程,F7和F8改变优先级,F9杀死进程。htop不是系统默认安装的,所以需要额外安装。

  5. nice
    通过nice命令的帮助,用户可以设置和改变进程的优先级。提高一个进程的优先级,内核会分配更多CPU时间片给这个进程。默认情况下,进程以0的优先级启动。进程优先级可以通过top命令显示的NI(nice value)列查看。
    进程优先级值的范围从-20到19。值越低,优先级越高。
    nice <优先值> <进程名> - 通过给定的优先值启动一个程序

  6. renice
    renice命令类似nice命令。使用这个命令可以改变正在运行的进程优先值。注意,用户只能改变属于他们自己的进程的优先值。
    renice -n -p - 改变指定进程的优先值
    renice -u -g - 通过指定用户和组来改变进程优先值

  7. kill
    kill常常用来向一个进程发送信号~
    这个命令用于发送信号来结束进程。如果一个进程没有响应杀死命令,这也许就需要强制杀死,使用-9参数来执行。注意,使用强制杀死的时候一定要小心,因为进程没有时机清理现场,也许写入文件没有完成。如果我们不知道进程PID或者打算用名字杀死进程时候,killall就能派上用场。
    kill
    kill -9
    killall -9 - 杀死所有拥有同样名字的进程
    如果你使用kill,你需要知道进程ID号。pkill是类似的命令,但使用模式匹配,如进程名,进程拥有者等。
    pkill <进程名>

  8. ulimit
    该命令用于控制系统资源在shell和进程上的分配量。对于系统管理员是最有用的,可以管理重度使用和存在性能问题的系统。限制资源大小可以确保重要进程持续运行,其他进程不会占用过多资源。
    ulimit -a - 显示当前用户关联的资源限制
    -f - 最大文件尺寸大小
    -v - 最大虚拟内存大小(KB)
    -n - 增加最大文件描述符数量
    -H : 改变和报告硬限制
    -S : 改变和报告软限制
    浏览ulimit man页面获取更多选项。

  9. w
    w 提供当前登录的用户及其正在执行的进程的信息。显示信息头包含信息,如当前时间、系统运行时长、登录用户总数、过去的1,5,15分钟内的负载均衡数。
    基于这些用户信息,用户在终止不属于他们的进程时要小心。
    who是类似命令,提供当前登录用户列表、系统启动时间、运行级别等。
    whoami 命令输出当前用户ID

    lijiaheng@lijiaheng-N550JK:/$ w
    15:41:42 up 3 days, 16:03, 1 user, load average: 0.38, 0.26, 0.20
    USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
    lijiahen tty7 :0 五23 3days 12:23 0.45s /sbin/upstart -

  10. pgrep
    pgrep的意思是”进程号全局正则匹配输出”。该命令扫描当前运行进程,然后按照命令匹配条件列出匹配结果到标准输出。对于通过名字检索进程号是很有用。
    pgrep -u mint sh
    这个命令将会显示用户为‘mint’和进程名为‘sh’的进程ID。

  11. fg , bg
    有时,命令需要很长的时间才能执行完成。对于这种情况,我们使用‘bg’命令可以将任务放在后台执行,而用‘fg’可以调到前台来使用。
    我们可以通过‘&’在后台启动一个程序:
    find . -name *iso > /tmp/res.txt &
    一个正在运行的程序也可以通过“CTRL+Z”和“bg”命令组合放到后台运行。
    find . -name *iso > /tmp/res.txt & - 启动一个程序
    ctrl+z - 挂起当前执行程序
    bg <进程ID> - 将程序放到后台运行
    我们可以使用‘jobs’命令列出所有后台进程。
    jobs
    使用‘fg’命令可以将后台程序调到前台执行。
    fg <进程id>

  12. ipcs
    ipcs命令报告进程间通信设施状态。(共享内存,信号量和消息队列)
    用-p参数联合-m、-s或-q使用,可以获得相关的进程间通信的进程ID。
    ipcs -p -m
    下面屏幕截图列出了最近访问了共享内存段的进程的创建者的ID和进程ID。

    lijiaheng@lijiaheng-N550JK:/$ ipcs -p -m
    —— Shared Memory Creator/Last-op PIDs ——–
    shmid 拥有者 cpid lpid
    884736 lijiaheng 1818 16810
    917505 lijiaheng 1633 16810
    1736706 lijiaheng 1595 16810
    786435 lijiaheng 1641 16810
    1081348 lijiaheng 1819 16810
    1540101 lijiaheng 1633 16810
    1146886 lijiaheng 1819 16810
    1638407 lijiaheng 1623 16810
    107216904 lijiaheng 12163 16810
    155189257 lijiaheng 2028 16810
    2129930 lijiaheng 2283 16810
    108757003 lijiaheng 12163 16810
    103645196 lijiaheng 12163 16810
    2490381 lijiaheng 2760 16810
    103612430 lijiaheng 12163 16810
    4587535 lijiaheng 2866 16810
    107184144 lijiaheng 12163 16810
    107151377 lijiaheng 12163 16810
    103874578 lijiaheng 12163 16810
    103907347 lijiaheng 12163 16810
    107249684 lijiaheng 12163 16810
    108953621 lijiaheng 12163 16810
    126451734 lijiaheng 12163 16810
    105840663 lijiaheng 1595 16810
    110100504 lijiaheng 12163 16810
    108986393 lijiaheng 12163 16810
    109051930 lijiaheng 12163 16810
    119439387 lijiaheng 12163 16810
    110133276 lijiaheng 12163 16810
    119373853 lijiaheng 12163 16810
    129269790 lijiaheng 15441 16810
    144408607 lijiaheng 12163 16810

0 0