/proc文件系统 linux

2012-07-15 02:22:58 zdwzzu2006 阅读数 137919

1. /proc目录
Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。

用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。下面列出的这些文件或子文件夹,并不是都是在你的系统中存在,这取决于你的内核配置和装载的模块。另外,在/proc下还有三个很重要的目录:net,scsi和sys。 Sys目录是可写的,可以通过它来访问或修改内核的参数,而net和scsi则依赖于内核配置。例如,如果系统不支持scsi,则scsi 目录不存在。

除了以上介绍的这些,还有的是一些以数字命名的目录,它们是进程目录。系统中当前运行的每一个进程都有对应的一个目录在/proc下,以进程的 PID号为目录名,它们是读取进程信息的接口。而self目录则是读取进程本身的信息接口,是一个link。

2. 子文件或子文件夹
/proc/buddyinfo 每个内存区中的每个order有多少块可用,和内存碎片问题有关

/proc/cmdline 启动时传递给kernel的参数信息

/proc/cpuinfo cpu的信息

/proc/crypto 内核使用的所有已安装的加密密码及细节

/proc/devices 已经加载的设备并分类


/proc/dma 已注册使用的ISA DMA频道列表

/proc/execdomains Linux内核当前支持的execution domains

/proc/fb 帧缓冲设备列表,包括数量和控制它的驱动

/proc/filesystems 内核当前支持的文件系统类型

/proc/interrupts x86架构中的每个IRQ中断数

/proc/iomem 每个物理设备当前在系统内存中的映射

/proc/ioports 一个设备的输入输出所使用的注册端口范围

/proc/kcore 代表系统的物理内存,存储为核心文件格式,里边显示的是字节数,等于RAM大小加上4kb

/proc/kmsg 记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg来处理

/proc/loadavg 根据过去一段时间内CPU和IO的状态得出的负载状态,与uptime命令有关

/proc/locks 内核锁住的文件列表

/proc/mdstat 多硬盘,RAID配置信息(md=multiple disks)

/proc/meminfo RAM使用的相关信息

/proc/misc 其他的主要设备(设备号为10)上注册的驱动

/proc/modules 所有加载到内核的模块列表

/proc/mounts 系统中使用的所有挂载

/proc/mtrr 系统使用的Memory Type Range Registers (MTRRs)

/proc/partitions 分区中的块分配信息

/proc/pci 系统中的PCI设备列表

/proc/slabinfo 系统中所有活动的 slab 缓存信息

/proc/stat 所有的CPU活动信息

/proc/sysrq-trigger 使用echo命令来写这个文件的时候,远程root用户可以执行大多数的系统请求关键命令,就好像在本地终端执行一样。要写入这个文件,需要把/proc/sys/kernel/sysrq不能设置为0。这个文件对root也是不可读的

/proc/uptime 系统已经运行了多久

/proc/swaps 交换空间的使用情况

/proc/version Linux内核版本和gcc版本

/proc/bus 系统总线(Bus)信息,例如pci/usb等

/proc/driver 驱动信息

/proc/fs 文件系统信息

/proc/ide ide设备信息

/proc/irq 中断请求设备信息

/proc/net 网卡设备信息

/proc/scsi scsi设备信息

/proc/tty tty设备信息

/proc/net/dev 显示网络适配器及统计信息

/proc/vmstat 虚拟内存统计信息

/proc/vmcore 内核panic时的内存映像

/proc/diskstats 取得磁盘信息

/proc/schedstat kernel调度器的统计信息

/proc/zoneinfo 显示内存空间的统计信息,对分析虚拟内存行为很有用

以下是/proc目录中进程N的信息

/proc/N pid为N的进程信息

/proc/N/cmdline 进程启动命令

/proc/N/cwd 链接到进程当前工作目录

/proc/N/environ 进程环境变量列表

/proc/N/exe 链接到进程的执行命令文件

/proc/N/fd 包含进程相关的所有的文件描述符

/proc/N/maps 与进程相关的内存映射信息

/proc/N/mem 指代进程持有的内存,不可读

/proc/N/root 链接到进程的根目录

/proc/N/stat 进程的状态

/proc/N/statm 进程使用的内存的状态

/proc/N/status 进程状态信息,比stat/statm更具可读性

/proc/self 链接到当前正在运行的进程

3. 例子
3.1 /proc/
yafang@QA:~$ ls /proc/

1      16819  21242  2180   2494  8768         interrupts    partitions

116    16820  21244  2181   2524  885          iomem         sched_debug

11740  17901  21245  21810  2525  acpi         ioports       scsi

11742  17903  21247  21812  3     asound       irq           self

11743  17904  2131   21813  39    buddyinfo    kallsyms      slabinfo

13452  18362  21319  21923  4     bus          kcore         stat

13454  18364  2132   2193   41    cgroups      key-users     swaps

13455  18365  2139   21933  42    cmdline      kmsg          sys

149    19451  2142   2209   5     cpuinfo      kpagecount    sysrq-trigger

150    19453  21572  2212   5330  crypto       kpageflags    sysvipc

151    19454  21574  2219   596   devices      loadavg       timer_list

152    2      21575  2243   597   diskstats    locks         timer_stats

15771  2083   2158   2260   6     dma          meminfo       tty

15773  2092   21625  2261   617   driver       misc          uptime

15774  2101   21627  2262   619   execdomains  modules       version

16232  21112  21628  2263   7     fb           mounts        vmallocinfo

16234  21115  2165   2264   804   filesystems  mtrr          vmstat

16235  21116  2167   2265   8765  fs           net           zoneinfo

16811  2112   2177   2338   8767  ide          pagetypeinfo

3.2 /proc/sys
系统信息和内核参数

yafang@QA:~$ ls /proc/sys

debug  dev  fs  kernel  net  vm

3.3 /proc/net
网卡设备信息

yafang@QA:~$ ls /proc/net

anycast6   ip6_flowlabel  netfilter  raw6       sockstat6     udplite

arp        ip6_mr_cache   netlink    route      softnet_stat  udplite6

dev        ip6_mr_vif     netstat    rt6_stats  stat          unix

dev_mcast  ip_mr_cache    packet     rt_acct    tcp           vlan

dev_snmp6  ip_mr_vif      protocols  rt_cache   tcp6          wireless

if_inet6   ipv6_route     psched     snmp       tr_rif

igmp       mcfilter       ptype      snmp6      udp

igmp6      mcfilter6      raw        sockstat   udp6

3.4 /proc/scsi
SCSI设备信息

yafang@QA:~$ ls /proc/scsi

device_info  scsi

3.5 /proc/modules 
所有加载到内核的模块列表

root@BDSP-A-2-1-2:~# cat /proc/modules

bdspboard 8486 2 dspcontrol, Live 0xe134c000

dspcontrol 9575 1 clkmon, Live 0xe135b000

clkmon 6765 1 - Live 0xe136c000

diagint 6635 1 - Live 0xe1379000

bdsprio 10775 2 srioif,tsi577, Live 0xe9389000

tsi577 17998 1 srioif, Live 0xe939e000

srioif 7329 0 - Live 0xe93b2000

linux_kernel_bde 54666 1 linux_user_bde, Live 0xf1417000 (P)

linux_user_bde 17849 0 - Live 0xf1427000 (P)

root@BDSP-A-2-1-2:~#

3.6 /proc/devices 
已经加载的设备并分类

root@BCNMB-A:~# cat /proc/devices


Character devices:

  1 mem

  2 pty

  3 ttyp

  4 /dev/vc/0

  4 tty

  4 ttyS

  5 /dev/tty

  5 /dev/console

  5 /dev/ptmx

  7 vcs

 10 misc

 13 input

 89 i2c

 90 mtd

116 linux-user-bde2

117 linux-kernel-bde2

126 linux-user-bde

127 linux-kernel-bde

128 ptm

136 pts

180 usb

189 usb_device

245 ext_alarm

251 ipmidev

252 usb_endpoint

253 usbmon

254 rtc

 

Block devices:

  1 ramdisk

  8 sd

 31 mtdblock

 65 sd

 66 sd

 67 sd

 68 sd

 69 sd

 70 sd

 71 sd

128 sd

129 sd

130 sd

131 sd

132 sd

133 sd

134 sd

135 sd

 


root@BCNMB-A:~#

3.7 /proc/partitions 
分区中的块分配信息

root@BDSP-A-2-1-2:~# cat /proc/partitions

major minor  #blocks  name

  31        0        512 mtdblock0

  31        1        512 mtdblock1

  31        2     123904 mtdblock2

  31        3       4096 mtdblock3

  31        4       1024 mtdblock4

  31        5       1024 mtdblock5

  31        6        512 mtdblock6

  31        7        512 mtdblock7

  31        8     123904 mtdblock8

  31        9       4096 mtdblock9

  31       10       1024 mtdblock10

  31       11       1024 mtdblock11

  31       12    1048576 mtdblock12

root@BDSP-A-2-1-2:~#

3.8 /proc/version
Linux内核版本和gcc版本

root@BDSP-A-2-1-2:~# cat /proc/version

Linux version 2.6.34.6-WR4.0.0.0_standard (satomi@CharlieBrown) (gcc version 4.4.1 (Wind River Linux Sourcery G++ 4.4-291) ) #1 SMP PREEMPT Fri Nov 26 16:07:47 CST 2010

root@BDSP-A-2-1-2:~#

3.9 /proc/sys/fs/file-max
该文件指定了可以分配的文件句柄的最大数目。如果用户得到的错误消息声明由于打开文件数已经达到了最大值,从而他们不能打开更多文件,则可能需要增加该值。可将这个值设置成有任意多个文件,并且能通过将一个新数字值写入该文件来更改该值。默认设置时4096。

改变内核的参数,用vi编辑或echo参数重定向到文件中。

# cat /proc/sys/fs/file-max

4096

# echo 8192 > /proc/sys/fs/file-max

# cat /proc/sys/fs/file-max

8192  

如果优化了参数,则可以把它们写成添加到文件rc.local中,使它在系统启动时自动完成修改。

2013-06-14 09:19:17 xinyuwuxian 阅读数 3957

使用 /proc 文件系统来访问 Linux 内核的内容

简介: /proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux 内核空间和用户空间之间进行通信。在 /proc 文件系统中,我们可以将对虚拟文件的读写作为与内核中实体进行通信的一种手段,但是与普通文件不同的是,这些虚拟文件的内容都是动态创建的。本文对 /proc 虚拟文件系统进行了介绍,并展示了它的用法。

最初开发 /proc 文件系统是为了提供有关系统中进程的信息。但是由于这个文件系统非常有用,因此内核中的很多元素也开始使用它来报告信息,或启用动态运行时配置。
/proc 文件系统包含了一些目录(用作组织信息的方式)和虚拟文件。虚拟文件可以向用户呈现内核中的一些信息,也可以用作一种从用户空间向内核发送信息的手段。实际上我们并不会同时需要实现这两点,但是本文将向您展示如何配置这个文件系统进行输入和输出。

尽管像本文这样短小的一篇文章无法详细介绍 /proc 的所有用法,但是它依然对这两种用法进行了展示,从而可以让我们体会一下 /proc 是多么强大。

root@ubuntu:~# cd /proc/
root@ubuntu:/proc# ls
1     1629  1813   1977   26712  4    843  acpi         key-users      softirqs
10    1633  1816   2      26994  41   849  asound       kmsg           stat
1008  1667  1819   20     26995  42   857  buddyinfo    kpagecount     swaps
11    1668  1820   2030   27     43   858  bus          kpageflags     sys
1152  1697  1822   2039   27043  44   860  cgroups      latency_stats  sysrq-trigger
1182  17    1830   20791  27054  45   861  cmdline      loadavg        sysvipc
12    1706  1835   2090   27055  46   867  cpuinfo      locks          timer_list
13    1711  1836   2091   27056  5    868  crypto       mdstat         timer_stats
132   1712  1844   21     27059  571  876  devices      meminfo        tty
14    1726  1852   2160   27064  6    878  diskstats    misc           uptime
1407  1744  1854   2194   27083  667  9    dma          modules        version
1427  1779  18642  2195   28     7    938  driver       mounts         version_signature
1475  1782  1885   22     29     721  939  execdomains  mpt            vmallocinfo
1483  1783  1887   2213   3      746  940  fb           mtrr           vmmemctl
1487  1786  1893   23     30     760  941  filesystems  net            vmstat
15    1792  1896   238    31     776  942  fs           pagetypeinfo   zoneinfo
1552  1795  19     24     32     778  943  interrupts   partitions
1557  1799  1900   240    326    782  944  iomem        sched_debug
16    18    1906   248    328    784  945  ioports      schedstat
1602  1806  1908   25476  35     785  946  irq          scsi
1621  1808  1920   265    37     797  947  kallsyms     self
1625  1811  1970   266    38     8    951  kcore        slabinfo
root@ubuntu:/proc# cd 1
root@ubuntu:/proc/1# ls
attr        coredump_filter  fd       loginuid   mountstats  personality  smaps   syscall
auxv        cpuset           fdinfo   maps       net         root         stack   task
cgroup      cwd              io       mem        oom_adj     sched        stat    wchan
clear_refs  environ          latency  mountinfo  oom_score   schedstat    statm
cmdline     exe              limits   mounts     pagemap     sessionid    status
root@ubuntu:/proc/1# cat cmdline 
/sbin/initroot@ubuntu:/proc/1# 
root@ubuntu:/proc/1# cat sta
stack   stat    statm   status  
root@ubuntu:/proc/1# cat stat
stat    statm   status  
root@ubuntu:/proc/1# cat status 
Name:	init
State:	S (sleeping)
Tgid:	1
Pid:	1
PPid:	0
TracerPid:	0
Uid:	0	0	0	0
Gid:	0	0	0	0
FDSize:	32
Groups:	
VmPeak:	    2804 kB
VmSize:	    2792 kB
VmLck:	       0 kB
VmHWM:	    1672 kB
VmRSS:	    1672 kB
VmData:	     436 kB
VmStk:	      84 kB
VmExe:	     100 kB
VmLib:	    2068 kB
VmPTE:	      28 kB
Threads:	1
SigQ:	1/7949
SigPnd:	0000000000000000
ShdPnd:	0000000000000000
SigBlk:	0000000000000000
SigIgn:	0000000000001000
SigCgt:	00000001a0012623
CapInh:	0000000000000000
CapPrm:	ffffffffffffffff
CapEff:	fffffffffffffeff
CapBnd:	ffffffffffffffff
Cpus_allowed:	ff
Cpus_allowed_list:	0-7
Mems_allowed:	1
Mems_allowed_list:	0
voluntary_ctxt_switches:	2044
nonvoluntary_ctxt_switches:	259
Stack usage:	16 kB
root@ubuntu:/proc/1# 
上面是对 /proc 中部分元素进行一次交互查询的结果。它显示的是 /proc 文件系统的根目录中的内容。注意,在左边是一系列数字编号的文件。每个实际上都是一个目录,表示系统中的一个进程。由于在 GNU/Linux 中创建的第一个进程是 init 进程,因此它的 process-id 为 1。然后对这个目录执行一个 ls 命令,这会显示很多文件。每个文件都提供了有关这个特殊进程的详细信息。例如,要查看 init 的 command-line 项的内容,只需对 cmdline 文件执行 cat 命令。

/proc 中另外一些有趣的文件有:

cpuinfo,它标识了处理器的类型和速度;

pci,显示在 PCI 总线上找到的设备;

modules,标识了当前加载到内核中的模块。

顺便说一下,/proc 文件系统并不是 GNU/Linux 系统中的惟一一个虚拟文件系统。在这种系统上,sysfs 是一个与 /proc 类似的文件系统,但是它的组织更好(从 /proc 中学习了很多教训)。不过 /proc 已经确立了自己的地位,因此即使 sysfs 与 /proc 相比有一些优点,/proc 也依然会存在。还有一个 debugfs 文件系统,不过(顾名思义)它提供的更多是调试接口。debugfs 的一个优点是它将一个值导出给用户空间非常简单(实际上这不过是一个调用而已)。

创建并删除 /proc 项

要在 /proc 文件系统中创建一个虚拟文件,请使用 create_proc_entry 函数。这个函数可以接收一个文件名、一组权限和这个文件在 /proc 文件系统中出现的位置。create_proc_entry 的返回值是一个 proc_dir_entry 指针(或者为 NULL,说明在 create 时发生了错误)。然后就可以使用这个返回的指针来配置这个虚拟文件的其他参数,例如在对该文件执行读操作时应该调用的函数。create_proc_entry 的原型和 proc_dir_entry 结构中的一部分如下面 所示。

struct proc_dir_entry *create_proc_entry( const char *name, mode_t mode,
                                             struct proc_dir_entry *parent );
struct proc_dir_entry {
	const char *name;			// virtual file name
	mode_t mode;				// mode permissions
	uid_t uid;				// File's user id
	gid_t gid;				// File's group id
	struct inode_operations *proc_iops;	// Inode operations functions
	struct file_operations *proc_fops;	// File operations functions
	struct proc_dir_entry *parent;		// Parent directory
	...
	read_proc_t *read_proc;			// /proc read function
	write_proc_t *write_proc;		// /proc write function
	void *data;				// Pointer to private data
	atomic_t count;				// use count
	...
};
void remove_proc_entry( const char *name, struct proc_dir_entry *parent );

假如上面create_proc_entry 的返回值是一个 proc_dir_entry 指针,那么使用以下方法配置该文件执行读写操作时应该调用的函数

proc_dir_entry ->read_proc = read_proc ; 
proc_dir_entry ->write_proc = write_proc ; 
稍后我们就可以看到如何使用 read_proc 和 write_proc 命令来插入对这个虚拟文件进行读写的函数。

要从 /proc 中删除一个文件,可以使用 remove_proc_entry 函数。要使用这个函数,我们需要提供文件名字符串,以及这个文件在 /proc 文件系统中的位置(parent)。

parent 参数可以为 NULL(表示 /proc 根目录),也可以是很多其他值,这取决于我们希望将这个文件放到什么地方。下面列表列出了可以使用的其他一些父 proc_dir_entry,以及它们在这个文件系统中的位置。

proc_dir_entry 在文件系统中的位置
proc_root_fs /proc
proc_net /proc/net
proc_bus /proc/bus
proc_root_driver /proc/driver

写回调函数

我们可以使用 write_proc 函数向 /proc 中写入一项。这个函数的原型如下:

int mod_write( struct file *filp, const char __user *buff,unsigned long len, void *data );

filp 参数实际上是一个打开文件结构(我们可以忽略这个参数)。buff 参数是传递给您的字符串数据。缓冲区地址实际上是一个用户空间的缓冲区,因此我们不能直接读取它。len 参数定义了在 buff 中有多少数据要被写入。data 参数是一个指向私有数据的指针。在这个模块中,我们声明了一个这种类型的函数来处理到达的数据。

Linux 提供了一组 API 来在用户空间和内核空间之间移动数据。对于 write_proc 的情况来说,我们使用了 copy_from_user 函数来维护用户空间的数据。

读回调函数

我们可以使用 read_proc 函数从一个 /proc 项中读取数据(从内核空间到用户空间)。这个函数的原型如下:

int mod_read( char *page, char **start, off_t off,int count, int *eof, void *data );

page 参数是这些数据写入到的位置,其中 count 定义了可以写入的最大字符数。在返回多页数据(通常一页是 4KB)时,我们需要使用 start 和 off 参数。当所有数据全部写入之后,就需要设置 eof(文件结束参数)。与 write 类似,data 表示的也是私有数据。此处提供的 page 缓冲区在内核空间中。因此,我们可以直接写入,而不用调用 copy_to_user。

其他有用的函数

我们还可以使用 proc_mkdir、symlinks 以及 proc_symlink 在 /proc 文件系统中创建目录。对于只需要一个 read 函数的简单 /proc 项来说,可以使用 create_proc_read_entry,这会创建一个 /proc 项,并在一个调用中对 read_proc 函数进行初始化。这些函数的原型如下所示。

/* Create a directory in the proc filesystem */
struct proc_dir_entry *proc_mkdir( const char *name,
                                     struct proc_dir_entry *parent );
/* Create a symlink in the proc filesystem */
struct proc_dir_entry *proc_symlink( const char *name,
                                       struct proc_dir_entry *parent,
                                       const char *dest );
/* Create a proc_dir_entry with a read_proc_t in one call */
struct proc_dir_entry *create_proc_read_entry( const char *name,
                                                  mode_t mode,
                                                  struct proc_dir_entry *base,
                                                  read_proc_t *read_proc,
                                                  void *data );
/* Copy buffer to user-space from kernel-space */
unsigned long copy_to_user( void __user *to,
                              const void *from,
                              unsigned long n );
/* Copy buffer to kernel-space from user-space */
unsigned long copy_from_user( void *to,
                                const void __user *from,
                                unsigned long n );
/* Allocate a 'virtually' contiguous block of memory */
void *vmalloc( unsigned long size );
/* Free a vmalloc'd block of memory */
void vfree( void *addr );
/* Export a symbol to the kernel (make it visible to the kernel) */
EXPORT_SYMBOL( symbol );
/* Export all symbols in a file to the kernel (declare before module.h) */
EXPORT_SYMTAB
create_proc_read_entry 

说明:

name : 要创建的文件名;

mode : 文件掩码,为 0 则按照系统默认的掩码创建文件。

base : 指定该文件所在的目录,如果为 NULL,则文件被创建在 /proc 根目录下。

read_proc : 实现该文件的 read_proc 函数。也就是说,当我们读取 "name" 这个文件时(如 cat /proc/myproc_name) ,读取请求会通过这个函数发送到驱动模块,然后在函数里处理的数据会写到 myproc_name 文件中。

data : 内核忽略此参数,但会把它当作参数传递给 read_proc 这个自定义函数。

用法:

struct proc_dir_entry *parent;
parent = proc_mkdir ("myproc", NULL);
create_proc_read_entry ("scullmem", 0744, parent, scull_read_procmem, NULL);
这样,就在 /proc 下创建了 myproc 目录,并在 myproc 目录下创建了一个名为 scullmem 的文件,且这个文件的权限为 0744 :
# ll /proc/myproc/scullmem 
-rwxr--r-- 1 root root 0 2010-09-27 20:48 /proc/myproc/scullmem*

上面的 scullmem 后有 1 星号表示此文件可执行,实际上 /proc 下的文件一般都是只读的,这里只是演示权限位。

通过 /proc 文件系统实现财富分发,一个比较经典的实例

这个简单的程序提供了一个财富甜点分发。在加载这个模块之后,用户就可以使用 echo 命令向其中导入文本财富,然后再使用 cat 命令逐一读出。

init 函数(init_fortune_module)负责使用 vmalloc 来为这个点心罐分配空间,然后使用 memset 将其全部清零。使用所分配并已经清空的 cookie_pot 内存,我们在 /proc 中创建了一个 proc_dir_entry 项,并将其称为 fortune。当 proc_entry 成功创建之后,对自己的本地变量和 proc_entry 结构进行了初始化。我们加载了 /proc read 和 write 函数,并确定这个模块的所有者。cleanup 函数简单地从 /proc 文件系统中删除这一项,然后释放 cookie_pot 所占据的内存。

cookie_pot 是一个固定大小(4KB)的页,它使用两个索引进行管理。第一个是 cookie_index,标识了要将下一个 cookie 写到哪里去。变量 next_fortune 标识了下一个 cookie 应该从哪里读取以便进行输出。在所有的 fortune 项都读取之后,我们简单地回到了 next_fortune。

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/string.h>
#include <linux/vmalloc.h>
#include <asm/uaccess.h>
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Fortune Cookie Kernel Module");
MODULE_AUTHOR("M. Tim Jones");
#define MAX_COOKIE_LENGTH       PAGE_SIZE
static struct proc_dir_entry *proc_entry;
static char *cookie_pot;  // Space for fortune strings
static int cookie_index;  // Index to write next fortune
static int next_fortune;  // Index to read next fortune
int init_fortune_module( void )
{
  int ret = 0;
  cookie_pot = (char *)vmalloc( MAX_COOKIE_LENGTH );
  if (!cookie_pot) {
    ret = -ENOMEM;
  } else {
    memset( cookie_pot, 0, MAX_COOKIE_LENGTH );
    proc_entry = create_proc_entry( "fortune", 0644, NULL );
    if (proc_entry == NULL) {
      ret = -ENOMEM;
      vfree(cookie_pot);
      printk(KERN_INFO "fortune: Couldn't create proc entry\n");
    } else {
      cookie_index = 0;
      next_fortune = 0;
      proc_entry->read_proc = fortune_read;
      proc_entry->write_proc = fortune_write;
      proc_entry->owner = THIS_MODULE;
      printk(KERN_INFO "fortune: Module loaded.\n");
    }
  }
  return ret;
}
void cleanup_fortune_module( void )
{
  remove_proc_entry("fortune", &proc_root);
  vfree(cookie_pot);
  printk(KERN_INFO "fortune: Module unloaded.\n");
}
module_init( init_fortune_module );
module_exit( cleanup_fortune_module );
向这个罐中新写入一个 cookie 非常简单。使用这个写入 cookie 的长度,我们可以检查是否有这么多空间可用。如果没有,就返回 -ENOSPC,它会返回给用户空间。否则,就说明空间存在,我们使用 copy_from_user 将用户缓冲区中的数据直接拷贝到 cookie_pot 中。然后增大 cookie_index(基于用户缓冲区的长度)并使用 NULL 来结束这个字符串。最后,返回实际写入 cookie_pot 的字符的个数,它会返回到用户进程。

ssize_t fortune_write( struct file *filp, const char __user *buff,
                        unsigned long len, void *data )
{
  int space_available = (MAX_COOKIE_LENGTH-cookie_index)+1;
  if (len > space_available) {
    printk(KERN_INFO "fortune: cookie pot is full!\n");
    return -ENOSPC;
  }
  if (copy_from_user( &cookie_pot[cookie_index], buff, len )) {
    return -EFAULT;
  }
  cookie_index += len;
  cookie_pot[cookie_index-1] = 0;
  return len;
}
对 fortune 进行读取也非常简单。由于我们刚才写入数据的缓冲区(page)已经在内核空间中了,因此可以直接对其进行操作,并使用 sprintf 来写入下一个 fortune。如果 next_fortune 索引大于 cookie_index(要写入的下一个位置),那么我们就将 next_fortune 返回为 0,这是第一个 fortune 的索引。在将这个 fortune 写入用户缓冲区之后,在 next_fortune 索引上增加刚才写入的 fortune 的长度。这样就变成了下一个可用 fortune 的索引。这个 fortune 的长度会被返回并传递给用户。

int fortune_read( char *page, char **start, off_t off,
                   int count, int *eof, void *data )
{
  int len;
  if (off > 0) {
    *eof = 1;
    return 0;
  }
  /* Wrap-around */
  if (next_fortune >= cookie_index) next_fortune = 0;
  len = sprintf(page, "%s\n", &cookie_pot[next_fortune]);
  next_fortune += len;
  return len;
}
从这个简单的例子中,我们可以看出通过 /proc 文件系统与内核进行通信实际上是件非常简单的事情。现在让我们来看一下这个 fortune 模块的用法
[root@plato]# insmod fortune.ko
[root@plato]# echo "Success is an individual proposition.  
          Thomas Watson" > /proc/fortune
[root@plato]# echo "If a man does his best, what else is there?  
                Gen. Patton" > /proc/fortune
[root@plato]# echo "Cats: All your base are belong to us.  
                      Zero Wing" > /proc/fortune
[root@plato]# cat /proc/fortune
Success is an individual proposition.  Thomas Watson
[root@plato]# cat /proc/fortune
If a man does his best, what else is there?  General Patton
[root@plato]#
/proc 虚拟文件系统可以广泛地用来报告内核的信息,也可以用来进行动态配置。我们会发现它对于驱动程序和模块编程来说都是非常完整的。

待续。。。。

2018-04-14 20:07:39 xiaodingqq 阅读数 5531

原来对linux系统中的/proc目录不是很了解,只知道可以查看cpu,内存等相关的信息,后来一个朋友问我/proc目录的一些内容,还真没有答上来,于是搜索下资料,找到一篇不错的文章,学习了!

转载如下:


Linux中/proc目录下文件详解(一)

/proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用。可以使用的文件随系统配置的变化而变化。命令procinfo能够显示基于其中某些文件的多种系统信息。以下详细描述/proc下的文件。 

/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过 proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是 动态从系统内核读出所需信息并提交的。
--------------------------------------------------------------------------------


/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, 文件还会包含相应的标志。这个文件的格式为:文件由多行构成,每行包括一个域名称,一个冒号和一个值。

示例: 

[root@localhost proc]# cat cpuinfo

processor : 0

vendor_id : AuthenticAMD

cpu family : 6

model : 8

model name : AMD Athlon(tm) XP 1800+

stepping : 1

cpu MHz : 1530.165

cache size : 256 KB

fdiv_bug : no

hlt_bug : no

f00f_bug : no

coma_bug : no

fpu : yes

fpu_exception : yes

cpuid level : 1

wp : yes

flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 mmx fxsr sse syscall mmxext 3dnowext 3dnow

bogomips : 2998.27



--------------------------------------------------------------------------------


/proc/devices文件

这个文件列出字符和块设备的主设备号,以及分配到这些设备号的设备名称。

示例: 

[root@localhost /]# cat /proc/devices

Character devices:

1 mem

4 /dev/vc/0

4 tty

4 ttyS

5 /dev/tty

5 /dev/console

5 /dev/ptmx

6 lp

7 vcs

10 misc

13 input

14 sound

29 fb

36 netlink

116 alsa

128 ptm

136 pts

180 usb




Block devices:

1 ramdisk

2 fd

3 ide0

9 md

22 ide1

253 device-mapper

254 mdp 


--------------------------------------------------------------------------------


/proc/dma文件 

这个文件列出由驱动程序保留的DMA通道和保留它们的驱动程序名称。casade项供用于把次DMA控制器从主控制器分出的DMA行所使用;这一行不能用于其它用途。

示例:


[root@localhost ~]# cat /proc/dma

4: cascade



--------------------------------------------------------------------------------


/proc/filesystems文件


这个文件列出可供使用的文件系统类型,一种类型一行。虽然它们通常是编入内核的文件系统类型,但该文件还可以包含可加载的内核模块加入的其它文件系统类型。

示例:

[root@localhost proc]# cat /proc/filesystems 

nodev sysfs

nodev rootfs

nodev bdev

nodev proc

nodev sockfs

nodev binfmt_misc

nodev usbfs

nodev usbdevfs

nodev futexfs

nodev tmpfs

nodev pipefs

nodev eventpollfs

nodev devpts

ext2

nodev ramfs

nodev hugetlbfs

iso9660

nodev mqueue

nodev selinuxfs

ext3

nodev rpc_pipefs

nodev autofs 


--------------------------------------------------------------------------------


/proc/interrupts文件

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

示例:

[root@localhost SPECS]# cat /proc/interrupts

CPU0

0: 7039406 XT-PIC timer

1: 6533 XT-PIC i8042

2: 0 XT-PIC cascade

3: 0 XT-PIC uhci_hcd

5: 108 XT-PIC VIA8233, uhci_hcd

8: 1 XT-PIC rtc

9: 0 XT-PIC acpi

10: 0 XT-PIC ehci_hcd

11: 17412 XT-PIC uhci_hcd, eth0

12: 140314 XT-PIC i8042

14: 37897 XT-PIC ide0

15: 60813 XT-PIC ide1

NMI: 0

ERR: 1 


--------------------------------------------------------------------------------


/proc/ioports文件


这个文件列出了诸如磁盘驱动器,以太网卡和声卡设备等多种设备驱动程序登记的许多I/O端口范围。

示例:

[root@localhost SPECS]# cat /proc/ioports

0000-001f : dma1

0020-0021 : pic1

0040-0043 : timer0

0050-0053 : timer1

0060-006f : keyboard

0070-0077 : rtc

0080-008f : dma page reg

00a0-00a1 : pic2

00c0-00df : dma2

00f0-00ff : fpu

0170-0177 : ide1

01f0-01f7 : ide0

0376-0376 : ide1

0378-037a : parport0

037b-037f : parport0

03c0-03df : vga+

03f6-03f6 : ide0

03f8-03ff : serial

0800-0803 : PM1a_EVT_BLK

0804-0805 : PM1a_CNT_BLK

0808-080b : PM_TMR

0810-0815 : ACPI CPU throttle

0820-0823 : GPE0_BLK

0cf8-0cff : PCI conf1

dc00-dcff : 0000:00:12.0

dc00-dcff : via-rhine

e000-e0ff : 0000:00:11.5

e000-e0ff : VIA8233

e400-e41f : 0000:00:10.0

e400-e41f : uhci_hcd

e800-e81f : 0000:00:10.1

e800-e81f : uhci_hcd

ec00-ec1f : 0000:00:10.2

ec00-ec1f : uhci_hcd

fc00-fc0f : 0000:00:11.1

fc00-fc07 : ide0

fc08-fc0f : ide1 


--------------------------------------------------------------------------------


/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文件

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

示例:

[root@localhost redhat]# cat /proc/locks

1: POSIX ADVISORY READ 3822 03:0a:1067117 0 EOF

2: POSIX ADVISORY READ 3822 03:0a:1067138 0 EOF

3: POSIX ADVISORY WRITE 3326 03:0a:2326540 0 EOF

4: POSIX ADVISORY WRITE 2639 03:0a:2966595 0 EOF

5: FLOCK ADVISORY WRITE 2591 03:0a:2966586 0 EOF

6: POSIX ADVISORY WRITE 2540 03:0a:2966578 0 EOF

7: POSIX ADVISORY WRITE 2530 03:0a:2966579 0 EOF

8: POSIX ADVISORY WRITE 2402 03:0a:2966563 0 EOF

9: POSIX ADVISORY WRITE 2371 03:0a:2966561 0 EOF 



Linux中/proc目录下文件详解之(二)

-----------------------------------------------------------------------------------------------------
/proc/mdstat文件

这个文件包含了由md设备驱动程序控制的RAID设备信息。

示例:

[root@localhost ~]# cat /proc/mdstat
Personalities :
unused devices: 



--------------------------------------------------------------------------------


/proc/meminfo文件

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

示例:

[root@localhost ~]# cat /proc/meminfo
MemTotal:       223812 kB
MemFree:          3764 kB
Buffers:          9148 kB
Cached:          92112 kB
SwapCached:        364 kB
Active:         183640 kB
Inactive:        17196 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:       223812 kB
LowFree:          3764 kB
SwapTotal:      626524 kB
SwapFree:       620328 kB
Dirty:              12 kB
Writeback:           0 kB
Mapped:         142880 kB
Slab:            12668 kB
Committed_AS:   376732 kB
PageTables:       2336 kB
VmallocTotal:  3907576 kB
VmallocUsed:      2968 kB
VmallocChunk:  3904224 kB
HugePages_Total:     0
HugePages_Free:      0
Hugepagesize:     4096 kB



--------------------------------------------------------------------------------


/proc/misc文件

这个文件报告用内核函数misc_register登记的设备驱动程序。

示例:

[root@localhost ~]# cat /proc/misc
63 device-mapper
175 agpgart
135 rtc 


--------------------------------------------------------------------------------


/proc/modules文件

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

示例:

[root@localhost /]# cat /proc/modules
md5 4033 1 - Live 0x10a7f000
ipv6 232577 8 - Live 0x10b0c000
parport_pc 24705 1 - Live 0x10a8b000
lp 11565 0 - Live 0x10a7b000
parport 41737 2 parport_pc,lp, Live 0x10a55000
autofs4 24005 0 - Live 0x10a74000
i2c_dev 10433 0 - Live 0x109d2000
i2c_core 22081 1 i2c_dev, Live 0x10a6d000
sunrpc 160421 1 - Live 0x10a9d000
ipt_REJECT 6465 1 - Live 0x109da000
ipt_state 1857 5 - Live 0x109eb000
ip_conntrack 40693 1 ipt_state, Live 0x10a62000
iptable_filter 2753 1 - Live 0x10896000
ip_tables 16193 3 ipt_REJECT,ipt_state,iptable_filter, Live 0x109ed000
dm_mod 54741 0 - Live 0x109f8000
button 6481 0 - Live 0x10905000
battery 8517 0 - Live 0x109d6000
ac 4805 0 - Live 0x10908000
uhci_hcd 31449 0 - Live 0x109dd000
ehci_hcd 31557 0 - Live 0x10949000
snd_via82xx 27237 2 - Live 0x10953000
snd_ac97_codec 64401 1 snd_via82xx, Live 0x10912000
snd_pcm_oss 47609 0 - Live 0x1093c000
snd_mixer_oss 17217 2 snd_pcm_oss, Live 0x1090c000
snd_pcm 97993 2 snd_via82xx,snd_pcm_oss, Live 0x10923000
snd_timer 29765 1 snd_pcm, Live 0x108ec000
snd_page_alloc 9673 2 snd_via82xx,snd_pcm, Live 0x108bd000
gameport 4801 1 snd_via82xx, Live 0x108a6000
snd_mpu401_uart 8769 1 snd_via82xx, Live 0x108b9000
snd_rawmidi 26725 1 snd_mpu401_uart, Live 0x108e4000
snd_seq_device 8137 1 snd_rawmidi, Live 0x1083b000
snd 54053 11 snd_via82xx,snd_ac97_codec,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_timer,snd_mpu401_uart,snd_rawmidi,snd_seq_device, Live 0x108f6000
soundcore 9889 2 snd, Live 0x1089b000
via_rhine 23497 0 - Live 0x1089f000
mii 4673 1 via_rhine, Live 0x10893000
floppy 58609 0 - Live 0x108a9000
ext3 116809 1 - Live 0x10875000
jbd 74969 1 ext3, Live 0x10861000


lsmod命令显示结果如下:


[root@localhost /]# lsmod
Module                  Size  Used by
md5                     4033  1
ipv6                  232577  8
parport_pc             24705  1
lp                     11565  0
parport                41737  2 parport_pc,lp
autofs4                24005  0
i2c_dev                10433  0
i2c_core               22081  1 i2c_dev
sunrpc                160421  1
ipt_REJECT              6465  1
ipt_state               1857  5
ip_conntrack           40693  1 ipt_state
iptable_filter          2753  1
ip_tables              16193  3 ipt_REJECT,ipt_state,iptable_filter
dm_mod                 54741  0
button                  6481  0
battery                 8517  0
ac                      4805  0
uhci_hcd               31449  0
ehci_hcd               31557  0
snd_via82xx            27237  2
snd_ac97_codec         64401  1 snd_via82xx
snd_pcm_oss            47609  0
snd_mixer_oss          17217  2 snd_pcm_oss
snd_pcm                97993  2 snd_via82xx,snd_pcm_oss
snd_timer              29765  1 snd_pcm
snd_page_alloc          9673  2 snd_via82xx,snd_pcm
gameport                4801  1 snd_via82xx
snd_mpu401_uart         8769  1 snd_via82xx
snd_rawmidi            26725  1 snd_mpu401_uart
snd_seq_device          8137  1 snd_rawmidi
snd                    54053  11 snd_via82xx,snd_ac97_codec,snd_pcm_oss,snd_mixer_oss,snd_pcm,snd_timer,snd_mpu401_uart,snd_rawmidi,snd_seq_device
soundcore               9889  2 snd
via_rhine              23497  0
mii                     4673  1 via_rhine
floppy                 58609  0
ext3                  116809  1
jbd                    74969  1 ext3 


--------------------------------------------------------------------------------


/proc/mounts文件

这个文件以/etc/mtab文件的格式给出当前系统所安装的文件系统信息。这个文件也能反映出任何手工安装从而在/etc/mtab文件中没有包含的文件系统。

示例:

[root@localhost /]# cat /proc/mounts
rootfs / rootfs rw 0 0
/proc /proc proc rw,nodiratime 0 0
none /dev tmpfs rw 0 0
/dev/root / ext3 rw 0 0
none /dev tmpfs rw 0 0
none /selinux selinuxfs rw 0 0
/proc /proc proc rw,nodiratime 0 0
/proc/bus/usb /proc/bus/usb usbfs rw 0 0
/sys /sys sysfs rw 0 0
none /dev/pts devpts rw 0 0
none /dev/shm tmpfs rw 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0 


--------------------------------------------------------------------------------


/proc/pci文件

这个文件给出PCI设备的信息。用它可以方便地诊断PCI问题。你可以从这个文件中检索到的信息包括诸如IDE接口或USB控制器这样的设备,总线,设备和功能编号,设备延迟以及IRQ编号。

示例:

[root@localhost /]# cat /proc/pci
PCI devices found:
  Bus  0, device   0, function  0:
    Class 0600: PCI device 1106:3116 (rev 0).
      Master Capable.  Latency=8.
      Prefetchable 32 bit memory at 0xe0000000 [0xe7ffffff].
  Bus  0, device   1, function  0:
    Class 0604: PCI device 1106:b091 (rev 0).
      Master Capable.  No bursts.  Min Gnt=12.
  Bus  0, device  16, function  2:
    Class 0c03: PCI device 1106:3038 (rev 12.
      IRQ 5.
      Master Capable.  Latency=32.
      I/O at 0xec00 [0xec1f].
  Bus  0, device  16, function  1:
    Class 0c03: PCI device 1106:3038 (rev 12.
      IRQ 3.
      Master Capable.  Latency=32.
      I/O at 0xe800 [0xe81f].
  Bus  0, device  16, function  0:
    Class 0c03: PCI device 1106:3038 (rev 12.
    

  IRQ 11.
      Master Capable.  Latency=32.
      I/O at 0xe400 [0xe41f].
  Bus  0, device  16, function  3:
    Class 0c03: PCI device 1106:3104 (rev 130).
      IRQ 10.
      Master Capable.  Latency=32.
      Non-prefetchable 32 bit memory at 0xdfffff00 [0xdfffffff].
  Bus  0, device  17, function  0:
    Class 0601: PCI device 1106:3177 (rev 0).
  Bus  0, device  17, function  1:
    Class 0101: PCI device 1106:0571 (rev 6).
      IRQ 255.
      Master Capable.  Latency=32.
      I/O at 0xfc00 [0xfc0f].
  Bus  0, device  17, function  5:
    Class 0401: PCI device 1106:3059 (rev 80).
      IRQ 5.
      I/O at 0xe000 [0xe0ff].
  Bus  0, device  18, function  0:
    Class 0200: PCI device 1106:3065 (rev 116).
      IRQ 11.
      Master Capable.  Latency=32.  Min Gnt=3.Max Lat=8.
      I/O at 0xdc00 [0xdcff].
      Non-prefetchable 32 bit memory at 0xdffffe00 [0xdffffeff].
  Bus  1, device   0, function  0:
    Class 0300: PCI device 5333:8d04 (rev 0).
      IRQ 11.
      Master Capable.  Latency=32.  Min Gnt=4.Max Lat=255.
      Non-prefetchable 32 bit memory at 0xdfe80000 [0xdfefffff].
      Prefetchable 32 bit memory at 0xd0000000 [0xd7ffffff]. 


--------------------------------------------------------------------------------

/proc/stat文件 

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

示例:

[root@localhost /]# cat /proc/stat
cpu  31994 3898 7161 381600 15254 451 0
cpu0 31994 3898 7161 381600 15254 451 0
intr 4615930 4404290 3364 0 0 12 0 7 0 2 0 0 12618 112114 0 44142 39381
ctxt 1310498
btime 1148891913
processes 4249
procs_running 4
procs_blocked 0 


--------------------------------------------------------------------------------


/proc/uptime文件


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

示例:

[root@localhost /]# cat /proc/uptime
4477.04 4021.10 


--------------------------------------------------------------------------------


/proc/version文件

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

示例:


[root@localhost /]# cat /proc/version
Linux version 2.6.9-1.667 (bhcompile@tweety.build.redhat.com) (gcc version 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)) #1 Tue Nov 2 14:41:25 EST 2004



Linux中/proc目录下文件详解之(三)

--------------------------------------------------------------------------------
/proc/net子目录

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

示例:
[root@localhost /]# ls /proc/net
anycast6       ip_conntrack         mcfilter6  rt6_stats     tcp
arp            ip_conntrack_expect  netlink    rt_acct       tcp6
dev            ip_mr_cache          netstat    rt_cache      udp
dev_mcast      ip_mr_vif            packet     snmp          udp6
dev_snmp6      ip_tables_matches    psched     snmp6         unix
if_inet6       ip_tables_names      raw        sockstat      wireless
igmp           ip_tables_targets    raw6       sockstat6
igmp6          ipv6_route           route      softnet_stat
ip6_flowlabel  mcfilter             rpc        stat 
--------------------------------------------------------------------------------


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

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域套接口的套接口表 
--------------------------------------------------------------------------------


示例:[root@localhost /]# cat /proc/net/route
Iface   Destination     Gateway         Flags   RefCnt  Use     Metric  Mask   MTU      Window  IRTT
eth0    0035C2DA        00000000        0001    0       0       0       80FFFFF0
eth0    0000FEA9        00000000        0001    0       0       0       0000FFF0
eth0    00000000        0135C2DA        0003    0       0       0       00000000 
--------------------------------------------------------------------------------


[root@localhost /]# cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
   0: 00000000:8000 00000000:0000 0A 00000000:00000000 00:00000000 00000000    29        0 9525 1 0dde7500 3000 0 0 2 -1
   1: 00000000:006F 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0        0 9484 1 0dde79e0 3000 0 0 2 -1
   2: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0        0 10049 1 0a8e3a00 3000 0 0 2 -1
   3: 0100007F:14D7 00000000:0000 0A 00000000:00000000 00:00000000 00000000    99        0 9847 1 0dde7020 3000 0 0 2 -1
   4: 0100007F:0019 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0        0 10286 1 0a8e3520 3000 0 0 2 -1 
--------------------------------------------------------------------------------
[root@localhost /]# cat /proc/net/arp
IP address       HW type     Flags       HW address            Mask     Device
218.194.53.1     0x1         0x2         00:0D:BC:78:07:3F     *        eth0 
--------------------------------------------------------------------------------
[root@localhost /]# cat /proc/net/udp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
   0: 00000000:8000 00000000:0000 07 00000000:00000000 00:00000000 00000000    29        0 9520 2 0b4ef7c0
105: 00000000:14E9 00000000:0000 07 00000000:00000000 00:00000000 00000000    99        0 10284 2 0b4ef040
111: 00000000:006F 00000000:0000 07 00000000:00000000 00:00000000 00000000 0        0 9483 2 0b4efcc0
116: 00000000:02F4 00000000:0000 07 00000000:00000000 00:00000000 00000000 0        0 9511 2 0b4efa40
119: 00000000:0277 00000000:0000 07 00000000:00000000 00:00000000 00000000 0        0 10050 2 0b4ef2c0

--------------------------------------------------------------------------------


/proc/scsi子目录

此目录下包含一个列出了所有检测到的SCSI设备的文件,并且为每种控制器驱动程序提供一个目录,在这个目录下又为已安装的此种控制器的每个实例提供一个子目录。

示例:
由于本人的机器没有SCSI设备,顾暂时无法提供示例。 
--------------------------------------------------------------------------------


/proc/sys子目录

在此目录下有许多子目录。此目录中的许多项都可以用来调整系统的性能。这个目录包含信息太多,无法介绍全部。只在示例中展示目录下的一些文件。

示例:[root@localhost /]# ls /proc/sys
debug  dev  fs  kernel  net  proc  sunrpc  vm 
--------------------------------------------------------------------------------
[root@localhost ~]# ls /proc/sys/fs
aio-max-nr   dentry-state       file-nr      lease-break-time  overflowgid
aio-nr       dir-notify-enable  inode-nr     leases-enable     overflowuid
binfmt_misc  file-max           inode-state  mqueue            quota 
--------------------------------------------------------------------------------
[root@localhost ~]# ls /proc/sys/kernel
acct                   hotplug      panic                   sem
cad_pid                modprobe     panic_on_oops           shmall
cap-bound              msgmax       pid_max                 shmmax
core_pattern           msgmnb       print-fatal-signals     shmmni
core_uses_pid          msgmni       printk                  sysrq
ctrl-alt-del           ngroups_max  printk_ratelimit        tainted
domainname             osrelease    printk_ratelimit_burst  threads-max
exec-shield            ostype       pty                     vdso
exec-shield-randomize  overflowgid  random                  version
hostname               overflowuid  real-root-dev 
--------------------------------------------------------------------------------
[root@localhost ~]# ls /proc/sys/net
core  ethernet  ipv4  ipv6  unix 
--------------------------------------------------------------------------------

[root@localhost sys]# ls /proc/sys/vm
block_dump                 laptop_mode            nr_pdflush_threads
dirty_background_ratio     legacy_va_layout       overcommit_memory
dirty_expire_centisecs     lower_zone_protection  overcommit_ratio
dirty_ratio                max_map_count          page-cluster
dirty_writeback_centisecs  min_free_kbytes        swappiness
hugetlb_shm_group          nr_hugepages           vfs_cache_pressure 
--------------------------------------------------------------------------------

[root@localhost sys]# ls /proc/sys/net/ipv4
conf                               tcp_fack
icmp_echo_ignore_all               tcp_fin_timeout
icmp_echo_ignore_broadcasts        tcp_frto
icmp_ignore_bogus_error_responses  tcp_keepalive_intvl
icmp_ratelimit                     tcp_keepalive_probes
icmp_ratemask                      tcp_keepalive_time
igmp_max_memberships               tcp_low_latency
igmp_max_msf                       tcp_max_orphans
inet_peer_gc_maxtime               tcp_max_syn_backlog
inet_peer_gc_mintime               tcp_max_tw_buckets
inet_peer_maxttl                   tcp_mem
inet_peer_minttl                   tcp_moderate_rcvbuf
inet_peer_threshold                tcp_no_metrics_save
ip_autoconfig                      tcp_orphan_retries
ip_conntrack_max                   tcp_reordering
ip_default_ttl                     tcp_retrans_collapse
ip_dynaddr                         tcp_retries1
ip_forward                         tcp_retries2
ipfrag_high_thresh                 tcp_rfc1337
ipfrag_low_thresh                  tcp_rmem
ipfrag_secret_interval             tcp_sack
ipfrag_time                        tcp_stdurg
ip_local_port_range                tcp_synack_retries
ip_nonlocal_bind                   tcp_syncookies
ip_no_pmtu_disc                    tcp_syn_retries
neigh                              tcp_timestamps
netfilter                          tcp_tso_win_divisor
route                              tcp_tw_recycle
tcp_abort_on_overflow              tcp_tw_reuse
tcp_adv_win_scale                  tcp_vegas_alpha
tcp_app_win                        tcp_vegas_beta
tcp_bic                            tcp_vegas_cong_avoid
tcp_bic_fast_convergence           tcp_vegas_gamma
tcp_bic_low_window                 tcp_westwood
tcp_dsack                          tcp_window_scaling
tcp_ecn                            tcp_wmem 
--------------------------------------------------------------------------------

[root@localhost sys]# cat /proc/sys/kernel/shmall
2097152 
--------------------------------------------------------------------------------
[root@localhost sys]# cat /proc/sys/kernel/osrelease
2.6.9-1.667

--------------------------------------------------------------------------------


总结:
    /proc文件系统包含了大量的有关当前系统状态的信息。
2016-07-21 09:40:33 caoxing81 阅读数 974

在Linux中有额外的机制可以为内核和内核模块将信息发送给进程 – /proc 文件系统。最初设计的目的是允许更方便的对进程信息进行访问(因此得名),现在它被每一个有有趣的东西报告的内核使用,例如 /proc/modules 有模块的列表 /proc/meminfo 有内存使用的统计表。

  使用proc 文件系统的方法和使用设备驱动程序非常相似–创建一个 /proc 文件需要的所有信息的结构,包括任何处理函数的指针(在我们的例子中只有一个,当某人试图从 /proc 文件读时调用的那一个)。然后,init_module 在内核中登记该结构而cleanup_module 注销它。

  我们使用 proc_register_dynamic(这是在 2.0 版中的情况,在 2.2 版中如果我们将节点设置为0系统将自动为我们做到) 的原因是我们不想预先决定我们的文件的节点数字,而是为防止冲突而由内核决定它。通常的文件系统存在于磁盘上而不是内存中(/proc 在内存中),在这中情况下,节点数是是指向文件的索引节点所在的磁盘位置的指针。节点包含文件的信息(例如文件的存取权限)和指向磁盘位置或文件数据可以被找到的几个位置的指针。

  因为当文件被打开或关闭的时候不能得到调用,所以在这个模块中没有地方放置 MOD_INC_USE_COUNT 和 MOD_DEC_USE_COUNT,并且,如果文件被打开随后模块被移除,我们没有办法避免后果。在下一 章我们会看到一个艰难的但更灵活的可以处理/proc文件的实现方式,它也可以让我们防止那个问题。

Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。尽管在各种硬件平台上的 Linux 系统的 /proc 文件系统的基本概念都是相同的,但本文只讨论基于 intel x86 架构的 Linux /proc 文件系统。


/proc — 一个虚拟文件系统

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

grep proc /proc/mounts
/proc /proc proc rw 0 0

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

加载 proc 文件系统

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

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

察看 /proc 的文件

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

$ ls -l /proc/cpuinfo
-r–r–r– 1 root root 0 Dec 25 11:01 /proc/cpuinfo

$ file /proc/cpuinfo
/proc/cpuinfo: empty

$ cat /proc/cpuinfo

processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 8
model name : Pentium III (Coppermine)
stepping : 6
cpu MHz : 1000.119
cache size : 256 KB
fdiv_bug : no
hlt_bug : no
sep_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
cmov pat pse36 mmx fxsr xmm
bogomips : 1998.85

processor : 3
vendor_id : GenuineIntel
cpu family : 6
model : 8
model name : Pentium III (Coppermine)
stepping : 6
cpu MHz : 1000.119
cache size : 256 KB
fdiv_bug : no
hlt_bug : no
sep_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
cmov pat pse36 mmx fxsr xmm
bogomips : 1992.29

这是一个从双 CPU 的系统中得到的结果,上述大部分的信息十分清楚地给出了这个系统的有用的硬件信息。有些 /proc 的文件是经过编码的,不同的工具可以被用来解释这些编码过的信息并输出成可读的形式。这样的工具包括:’top’, ‘ps’, ‘apm’ 等。

得到有用的系统/内核信息

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 文件系统可以用于获取运行中的进程的信息。在 /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/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 下还有许多其它可以用于改变内核属性。读者可以通过参考文献获取更多信息。

结论

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

参考文献地址:

http://www.redhat.com/docs/manuals/linux/RHL-7.3-Manual/ref-guide/ch-proc.html

http://www.linuxfocus.org/English/January2004/article324.shtml#324lfindex0

/usr/src/linux/Documentation/filesystems/proc.txt

转自: http://blog.163.com/bob_www/blog/static/165615405201082102150135/

2015-03-31 11:44:45 zhouzhiwengang 阅读数 4965

工作原理:基于/proc 文件系统

Linux 系统为管理员提供了非常好的方法,使其可以在系统运行时更改内核,而不需要重新引导内核系统,这是通过/proc 虚拟文件系统实现的。/proc 文件虚拟系统是一种内核和内核模块用来向进程(process)发送信息的机制(所以叫做“/proc”),这个伪文件系统允许与内核内部数据结构交互,获取有关进程的有用信息,在运行中(on the fly)改变设置(通过改变内核参数)。与其他文件系统不同,/proc 存在于内存而不是硬盘中。proc 文件系统提供的信息如下:

进程信息:系统中的任何一个进程,在 proc 的子目录中都有一个同名的进程 ID,可以找到 cmdline、mem、root、stat、statm,以及 status。某些信息只有超级用户可见,例如进程根目录。每一个单独含有现有进程信息的进程有一些可用的专门链接,系统中的任何一个进程都有一个单独的自链接指向进程信息,其用处就是从进程中获取命令行信息。

系统信息:如果需要了解整个系统信息中也可以从/proc/stat 中获得,其中包括 CPU 占用情况、磁盘空间、内存对换、中断等。

CPU 信息:利用/proc/CPUinfo 文件可以获得中央处理器的当前准确信息。

负载信息:/proc/loadavg 文件包含系统负载信息。

系统内存信息:/proc/meminfo 文件包含系统内存的详细信息,其中显示物理内存的数量、可用交换空间的数量,以及空闲内存的数量等。

表 1 是 /proc 目录中的主要文件的说明:

表 1 /proc 目录中的主要文件的说明
文件或目录名称 描 述
apm 高级电源管理信息
cmdline 这个文件给出了内核启动的命令行
CPUinfo 中央处理器信息
devices 可以用到的设备(块设备/字符设备)
dma 显示当前使用的 DMA 通道
filesystems 核心配置的文件系统
ioports 当前使用的 I/O 端口
interrupts 这个文件的每一行都有一个保留的中断
kcore 系统物理内存映像
kmsg 核心输出的消息,被送到日志文件
mdstat 这个文件包含了由 md 设备驱动程序控制的 RAID 设备信息
loadavg 系统平均负载均衡
meminfo 存储器使用信息,包括物理内存和交换内存
modules 这个文件给出可加载内核模块的信息。lsmod 程序用这些信息显示有关模块的名称,大小,使用数目方面的信息
net 网络协议状态信息
partitions 系统识别的分区表
pci pci 设备信息
scsi scsi 设备信息
self 到查看/proc 程序进程目录的符号连接
stat 这个文件包含的信息有 CPU 利用率,磁盘,内存页,内存对换,全部中断,接触开关以及赏赐自举时间
swaps 显示的是交换分区的使用情况
uptime 这个文件给出自从上次系统自举以来的秒数,以及其中有多少秒处于空闲
version 这个文件只有一行内容,说明正在运行的内核版本。可以用标准的编程方法进行分析获得所需的系统信息

下面本文的几个例子都是使用 Python 脚本读取/proc 目录中的主要文件来实现实现对 Linux 服务器的监控的 。

使用 Python 脚本实现对 Linux 服务器的监控

对于 CPU(中央处理器)监测

脚本 1 名称 CPU1.py,作用获取 CPU 的信息。

清单 1.获取 CPU 的信息
#!/usr/bin/env Python
from __future__ import print_function
from collections import OrderedDict
import pprint

def CPUinfo():
    ''' Return the information in /proc/CPUinfo
    as a dictionary in the following format:
    CPU_info['proc0']={...}
    CPU_info['proc1']={...}
    '''
    CPUinfo=OrderedDict()
    procinfo=OrderedDict()

    nprocs = 0
    with open('/proc/CPUinfo') as f:
        for line in f:
            if not line.strip():
                # end of one processor
                CPUinfo['proc%s' % nprocs] = procinfo
                nprocs=nprocs+1
                # Reset
                procinfo=OrderedDict()
            else:
                if len(line.split(':')) == 2:
                    procinfo[line.split(':')[0].strip()] = line.split(':')[1].strip()
                else:
                    procinfo[line.split(':')[0].strip()] = ''
            
    return CPUinfo

if __name__=='__main__':
    CPUinfo = CPUinfo()
    for processor in CPUinfo.keys():
        print(CPUinfo[processor]['model name'])

简单说明一下清单 1,读取/proc/CPUinfo 中的信息,返回 list,每核心一个 dict。其中 list 是一个使用方括号括起来的有序元素集合。List 可以作为以 0 下标开始的数组。Dict 是 Python 的内置数据类型之一, 它定义了键和值之间一对一的关系。OrderedDict 是一个字典子类,可以记住其内容增加的顺序。常规 dict 并不跟踪插入顺序,迭代处理时会根据键在散列表中存储的顺序来生成值。在 OrderedDict 中则相反,它会记住元素插入的顺序,并在创建迭代器时使用这个顺序。

可以使用 Python 命令运行脚本 CPU1.py 结果见图 1

# Python CPU1.py 
Intel(R) Celeron(R) CPU E3200  @ 2.40GHz
图 1.运行清单 1
运行清单 1

也可以使用 chmod 命令添加权限收直接运行 CPU1.py

#chmod +x CPU1.py
# ./CPU1.py

对于系统负载监测

脚本 2 名称 CPU2.py,作用获取系统的负载信息

清单 2 获取系统的负载信息
#!/usr/bin/env Python   
import os 
def load_stat(): 
    loadavg = {} 
    f = open("/proc/loadavg") 
    con = f.read().split() 
    f.close() 
    loadavg['lavg_1']=con[0] 
    loadavg['lavg_5']=con[1] 
    loadavg['lavg_15']=con[2] 
    loadavg['nr']=con[3] 
    loadavg['last_pid']=con[4] 
    return loadavg 
print "loadavg",load_stat()['lavg_15']

简单说明一下清单 2:清单 2 读取/proc/loadavg 中的信息,import os :Python 中 import 用于导入不同的模块,包括系统提供和自定义的模块。其基本形式为:import 模块名 [as 别名],如果只需要导入模块中的部分或全部内容可以用形式:from 模块名 import *来导入相应的模块。OS 模块 os 模块提供了一个统一的操作系统接口函数,os 模块能在不同操作系统平台如 nt,posix 中的特定函数间自动切换,从而实现跨平台操作。

可以使用 Python 命令运行脚本 CPU1.py 结果见图 2 # Python CPU2.py

图 2.运行清单 2
运行清单 2

对于内存信息的获取

脚本 3 名称 mem.py,作用是获取内存使用情况信息

清单 3 获取内存使用情况
#!/usr/bin/env Python

from __future__ import print_function
from collections import OrderedDict

def meminfo():
    ''' Return the information in /proc/meminfo
    as a dictionary '''
    meminfo=OrderedDict()

    with open('/proc/meminfo') as f:
        for line in f:
            meminfo[line.split(':')[0]] = line.split(':')[1].strip()
    return meminfo

if __name__=='__main__':
    #print(meminfo())
    
    meminfo = meminfo()
    print('Total memory: {0}'.format(meminfo['MemTotal']))
    print('Free memory: {0}'.format(meminfo['MemFree']))

简单说明一下清单 3:清单 3 读取 proc/meminfo 中的信息,Python 字符串的 split 方法是用的频率还是比较多的。比如我们需要存储一个很长的数据,并且按照有结构的方法存储,方便以后取数据进行处理。当然可以用 json 的形式。但是也可以把数据存储到一个字段里面,然后有某种标示符来分割。 Python 中的 strip 用于去除字符串的首位字符,最后清单 3 打印出内存总数和空闲数。

可以使用 Python 命令运行脚本 mem.py 结果见图 3。 # Python mem.py

图 3.运行清单 3
运行清单 3

对于网络接口的监测

脚本 4 名称是 net.py,作用获取网络接口的使用情况。

清单 4 net.py 获取网络接口的输入和输出
#!/usr/bin/env Python
import time
import sys

if len(sys.argv) > 1:
	INTERFACE = sys.argv[1]
else:
	INTERFACE = 'eth0'
STATS = []
print 'Interface:',INTERFACE

def	rx():
	ifstat = open('/proc/net/dev').readlines()
	for interface in  ifstat:
		if INTERFACE in interface:
			stat = float(interface.split()[1])
			STATS[0:] = [stat]

def	tx():
	ifstat = open('/proc/net/dev').readlines()
	for interface in  ifstat:
		if INTERFACE in interface:
			stat = float(interface.split()[9])
			STATS[1:] = [stat]

print	'In			Out'
rx()
tx()

while	True:
	time.sleep(1)
	rxstat_o = list(STATS)
	rx()
	tx()
	RX = float(STATS[0])
	RX_O = rxstat_o[0]
	TX = float(STATS[1])
	TX_O = rxstat_o[1]
	RX_RATE = round((RX - RX_O)/1024/1024,3)
	TX_RATE = round((TX - TX_O)/1024/1024,3)
	print RX_RATE ,'MB		',TX_RATE ,'MB'

简单说明一下清单 4:清单 4 读取/proc/net/dev 中的信息,Python 中文件操作可以通过 open 函数,这的确很像 C 语言中的 fopen。通过 open 函数获取一个 file object,然后调用 read(),write()等方法对文件进行读写操作。另外 Python 将文本文件的内容读入可以操作的字符串变量非常容易。文件对象提供了三个“读”方法: read()、readline() 和 readlines()。每种方法可以接受一个变量以限制每次读取的数据量,但它们通常不使用变量。 .read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。然而 .read() 生成文件内容最直接的字符串表示,但对于连续的面向行的处理,它却是不必要的,并且如果文件大于可用内存,则不可能实现这种处理。.readline() 和 .readlines() 之间的差异是后者一次读取整个文件,象 .read() 一样。.readlines() 自动将文件内容分析成一个行的列表,该列表可以由 Python 的 for ... in ... 结构进行处理。另一方面,.readline() 每次只读取一行,通常比 .readlines() 慢得多。仅当没有足够内存可以一次读取整个文件时,才应该使用 .readline()。最后清单 4 打印出网络接口的输入和输出情况。

可以使用 Python 命令运行脚本 net.py 结果见图 4 #Python net.py

图 4.运行清单 4
运行清单 4

监控 Apache 服务器进程的 Python 脚本

Apache 服务器进程可能会因为系统各种原因而出现异常退出,导致 Web 服务暂停。所以笔者写一个 Python 脚本文件:

清单 5 crtrl.py 监控 Apache 服务器进程的 Python 脚本
#!/usr/bin/env Python 
import os, sys, time 

while True: 
time.sleep(4) 
try: 
ret = os.popen('ps -C apache -o pid,cmd').readlines() 
if len(ret) < 2: 
print "apache 进程异常退出, 4 秒后重新启动" 
time.sleep(3) 
os.system("service apache2 restart") 
except: 
print "Error", sys.exc_info()[1]

设置文件权限为执行属性(使用命令 chmod +x crtrl.py),然后加入到/etc/rc.local 即可,一旦 Apache 服务器进程异常退出,该脚本自动检查并且重启。 简单说明一下清单 5 这个脚本不是基于/proc 伪文件系统的,是基于 Python 自己提供的一些模块来实现的 。这里使用的是 Python 的内嵌 time 模板,time 模块提供各种操作时间的函数。

linux 中/proc 详解

阅读数 60311