linux系统提供了一个特殊的文件系统procfs,他通常以/proc目录的形式呈现。该目录中包含了许多特殊文件用来对驱动程序和内核信息进行更高层的访问。只要应用程序有正确的访问权限,他们就可以通过读写这些文件来获得信息或设置参数。
/proc目录中的文件会随系统的不同而不同,当linux版本中有更多的驱动程序和设施支持procfs文件系统时,该目录中就会包含更多的文件。在这里,我们只探讨一些常用的文件。
1./proc/cpuinfo给出的是cpu的详细信息,列举出一部分:
[aaa@localhost ~]$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 58
model name : Intel(R) Core(TM) i5-3317U CPU @ 1.70GHz
stepping : 9
microcode : 18
cpu MHz : 1696.170
2./proc/meminfo和/proc/version分别给出的是内存使用情况和内核版本信息:
[aaa@localhost ~]$ cat /proc/meminfo
MemTotal: 1004136 kB
MemFree: 70376 kB
Buffers: 21992 kB
Cached: 104436 kB
SwapCached: 16036 kB
Active: 384936 kB
Inactive: 411480 kB
Active(anon): 331584 kB
Inactive(anon): 354476 kB
Active(file): 53352 kB
Inactive(file): 57004 kB
Unevictable: 0 kB
[aaa@localhost ~]$ cat /proc/version
Linux version 2.6.32-642.el6.x86_64 (mockbuild@worker1.bsys.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-17) (GCC) ) #1 SMP Tue May 10 17:27:01 UTC 2016
3.我们还可以通过/proc/net/sockstat文件获得网络套接字的使用统计:
[aaa@localhost ~]$ cat /proc/net/sockstat
sockets: used 891
TCP: inuse 4 orphan 0 tw 0 alloc 8 mem 0
UDP: inuse 2 mem 1
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0
除此之外,/proc目录中的有些条目不仅可以被读取,而且可以被修改。例如系统中所有运行的程序同时能打开的文件总数是linux内核的一个参数。它的当前值可以通过/proc/sys/fs/file-max文件得到:
[aaa@localhost ~]$ cat /proc/sys/fs/file-max
96280
对/proc文件进行写操作需要root用户的权限,在修改数据时需要特别小心,写入不适当的值可能会引发严重的问题,造成系统崩溃,或者数据丢失。
切换到root用户:
[root@localhost luo]# echo 90000 > /proc/sys/fs/file-max
[root@localhost luo]# cat /proc/sys/fs/file-max
90000
/proc中以数字命名的子目录用于提供正在运行的程序的信息 例如数字1代表init进程:
[root@localhost proc]# cd 1
[root@localhost 1]# ls
[root@localhost 1]# ls -l
total 0
dr-xr-xr-x 2 root root 0 Jun 15 18:20 attr
-rw-r--r-- 1 root root 0 Jun 15 18:20 autogroup
-r-------- 1 root root 0 Jun 15 18:20 auxv
-r--r--r-- 1 root root 0 Jun 15 18:20 cgroup
--w------- 1 root root 0 Jun 15 18:20 clear_refs
-r--r--r-- 1 root root 0 Jun 15 18:20 cmdline
-rw-r--r-- 1 root root 0 Jun 15 18:20 comm
-rw-r--r-- 1 root root 0 Jun 15 18:20 coredump_filter
-r--r--r-- 1 root root 0 Jun 15 18:20 cpuset
lrwxrwxrwx 1 root root 0 Jun 15 18:20 cwd -> /
-r-------- 1 root root 0 Jun 15 18:20 environ
lrwxrwxrwx 1 root root 0 Jun 15 18:20 exe -> /sbin/init
dr-x------ 2 root root 0 Jun 15 18:20 fd
dr-x------ 2 root root 0 Jun 15 18:20 fdinfo
-r-------- 1 root root 0 Jun 15 18:20 io
-rw------- 1 root root 0 Jun 15 18:20 limits
-rw-r--r-- 1 root root 0 Jun 15 18:20 loginuid
-r--r--r-- 1 root root 0 Jun 15 18:20 maps
-rw------- 1 root root 0 Jun 15 18:20 mem
-r--r--r-- 1 root root 0 Jun 15 18:20 mountinfo
-r--r--r-- 1 root root 0 Jun 15 18:20 mounts
-r-------- 1 root root 0 Jun 15 18:20 mountstats
dr-xr-xr-x 6 root root 0 Jun 15 18:20 net
dr-x--x--x 2 root root 0 Jun 15 18:20 ns
-r--r--r-- 1 root root 0 Jun 15 18:20 numa_maps
-rw-r--r-- 1 root root 0 Jun 15 18:20 oom_adj
-r--r--r-- 1 root root 0 Jun 15 18:20 oom_score
-rw-r--r-- 1 root root 0 Jun 15 18:20 oom_score_adj
-r--r--r-- 1 root root 0 Jun 15 18:20 pagemap
-r--r--r-- 1 root root 0 Jun 15 18:20 personality
lrwxrwxrwx 1 root root 0 Jun 15 18:20 root -> /
-rw-r--r-- 1 root root 0 Jun 15 18:20 sched
-r--r--r-- 1 root root 0 Jun 15 18:20 schedstat
-r--r--r-- 1 root root 0 Jun 15 18:20 sessionid
-r--r--r-- 1 root root 0 Jun 15 18:20 smaps
-r--r--r-- 1 root root 0 Jun 15 18:20 stack
-r--r--r-- 1 root root 0 Jun 15 18:20 stat
-r--r--r-- 1 root root 0 Jun 15 18:20 statm
-r--r--r-- 1 root root 0 Jun 15 18:20 status
-r--r--r-- 1 root root 0 Jun 15 18:20 syscall
dr-xr-xr-x 3 root root 0 Jun 15 18:20 task
-r--r--r-- 1 root root 0 Jun 15 18:20 wchan
每个进程的proc目录内容都几乎由这些组成,来看一看其中的一些相关信息:
[root@localhost 1]# od -c cmdline
0000000 / s b i n / i n i t \0
0000013
由此,我们可以知道该进程从/sbin/init 程序启动;
[root@localhost 1]# cat environ
HOME=/TERM=linuxPATH=/sbin:/bin:/usr/sbin:/usr/bin
environ告诉我们该程序的运行环境
[root@localhost 1]# ls fd
0 1 2 3 4 5 6 7 8 9
fd目录下是该进程正在使用的打开的文件描述的信息