关于/proc文件系统
以前只知道/proc这个文件夹比较特殊,有一些内核参数可以在这里修改,并无更深入的了解。之后在一次笔试题中看到有问对/proc文件系统的理解,因为当时去打酱油了,所以也就没怎么在意。后来实验室的一个项目中要用到进程监控相关的东西,再次想到了/proc,这次正好好好学习一下。
大概更专业的叫法应该叫做proc文件系统(procfs),“/proc”是这个文件系统的挂载点,系统启动时完成自动挂载。说它奇怪是因为虽然你可以像平常的文件系统一样浏览,但是这个文件系统中的东西在硬盘是却是不存在的!当你用”ls -l”查看的时候,会发现除了一些链接文件之外,绝大部分文件的大小都是0。
Linux或是Unix设计时遵循的一个原则就是“一切皆文件”,除了正常的文本文件和二进制文件,比较典型的就是/dev下的文件,代表了系统的所有设备。另外还有用于进程间通信的管道和网络通信的socket,同样是以特殊文件的形式存在的。所以这里也就不难解释了,/proc 包含了当前系统运行时的所有状态。包括了内核状态,全部的进程信息,cpu信息,内存信息等等。既然是用来表示系统状态这种实时信息的,所以这个文件系统中的内容也会由系统实时生成。
查看和修改/proc中的内容使用ls命令查看/proc文件系统的话,显示的内容大致如下:
allen@allen-laptop:/proc$ ls /proc/
1 1169 1612 1775 1839 1894 22 30 478 691 925 execdomains mdstat sys
10 1199 1652 1783 1840 1896 23 31 480 7 928 fb meminfo sysrq-trigger
1075 12 1666 1787 1843 19 2387 32 49 70 934 filesystems misc sysvipc
1095 1201 1677 1789 1844 1902 2393 327 5 71 acpi fs modules timer_list
11 1256 1678 1794 1845 1904 24 33 50 789 asound interrupts mounts timer_stats
1101 13 1696 18 1846 1914 25 330 51 790 binder iomem mtrr tty
1104 1300 17 1813 1847 1980 2518 34 52 8 buddyinfo ioports net uptime
1109 1352 1711 1814 1848 1984 2522 35 523 834 bus irq pagetypeinfo version
1110 14 1750 1817 1853 2 2530 36 6 837 cgroups kallsyms partitions version_signature
1112 1491 1754 1818 1856 20 2531 37 62 840 cmdline kcore sched_debug vmallocinfo
1115 15 1755 1820 1864 2003 2532 38 63 842 cpuinfo key-users schedstat vmstat
1122 1509 1757 1823 1868 2016 26 4 64 847 crypto kmsg scsi zoneinfo
1135 1510 1762 1827 1874 2019 2610 401 65 850 devices kpagecount self
1136 1511 1765 1832 1886 2021 27 41 66 851 diskstats kpageflags slabinfo
1137 16 1766 1833 1889 2045 28 419 67 858 dma latency_stats softirqs
1138 1603 1770 1837 1890 21 29 420 68 9 dri loadavg stat
1140 1607 1773 1838 1892 2191 3 421 69 924 driver locks swaps
可以将其中的内容分为三类来看:以数字命名的文件夹,非数字命名的文件夹和单纯的文件。
全数字的文件夹代表了系统的所有进程,进程的PID即为文件夹名。如果仔细查看文件夹属性的话,这一类文件夹都是只读的。值得注意的是这里有一个特殊的符号连接“self”,代表了系统中的当前正在执行的进程。关于进程的更详细的内容就都包含在文件夹中的各个文件中了。那些非数字命名的文件夹比如:driver,bus,scsi等等一般表示了系统不同模块的相应信息。其中的sys是设置内核运行时参数很重要的途径。另外就是一些文件了,比如:cpuinfo,meminfo,devices等等,直接表示系统相应硬件信息。常用的总结如下:
上边说这里的内容都是由系统实时生成的,而且大部分内容都是只读的,所以想要查看其中某一文件的信息,只需要使用cat就可以了(习惯用法)。比如查看cpu信息,命令如下:
$cat/proc/cpuinfo关于进程信息上边已经说过,以数字命名的文件夹都是对应相应的进程的信息。随便选一个文件夹,查看一下内容大致如下:
allen@allen-laptop:/proc/3348$ lsattr cpuset io mountinfo pagemap smaps task
auxv cwd latency mounts personality stack wchan
cgroup environ limits mountstats root stat
clear_refs exe loginuid net sched statm
cmdline fd maps oom_adj schedstat status
coredump_filter fdinfo mem oom_score sessionid syscall
3348这个进程是我正在运行的bash的进程。需要注意的是当你进入一个不属于你的进程文件夹之后,某些文件可能权限不允许而不能访问。和上边情况类似,每个文件都表示所属进程某一方面的信息。常用的如下:
cmdline:表示进程启动时给它传递的所有参数。cwd:一个连接到此进程当前工作目录的符号连接。environ:包含此进程的全部环境变量。fd/:包含此进程所属的全部文件描述符的符号连接,可能会指向正在使用的文件或设备。status:包含全部的进程状态信息,监控进程主要查看这个文件。平时常用来显示进程信息的ps和top命令就是通过读取/proc文件系统中的内容来获取进程信息的。
设置内核参数虽说/proc下大部分文件都是只读的,仍然有一小部分是管理员可写的。其中最重要的就是/proc/sys文件夹中的内容。在这里管理员可以动态设定系统内核的各种参数,而不必等机器重启之后才生效。同样应为这里的内容是实时变化的,使用不同编辑器打开->编辑->保存这样的方式来设置参数是不可行的。因为很可能在你编辑内容的时候,它已经发生了变化。正确的方法是使用echo命令。比如你想修改系统默认允许进程打开最大文件描述上限,可以这样:
#echo "16384" > /proc/sys/fs/file-max更详细内容可以在参考文章中查看。
参考文章http://en.wikipedia.org/wiki/Procfs
http://www.linux.com/archive/articles/126718
http://www.ibm.com/developerworks/library/l-proc.html
http://www.ibm.com/developerworks/linux/library/l-adfly.html
本文转载自:http://hi.baidu.com/allense7en/item/42852f5ca57d6f12da16358b