Linux资源监控命令/工具(调试)

1、直接将指令丢到背景中执行:&
[root@linux ~]# tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
[1] 24984
[root@linux ~]# <==可以继续作业,不受影响!这就是前景!
完成的时候会显示:
[1]+ Done tar -zpcf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1

2、将目前的工作丢到背景中暂停:[ctrl]-z (挂起,并没有在后台执行)
[root@linux ~]# vi ~/.bashrc
# 在vi的一般模式下,按下[ctrl]-z这两个按键
[1]+ Stopped /usr/bin/vim ~/.bashrc
[root@linux ~]# <==顺利取得了前景的操控权

3、观察目前的背景工作状态:jobs
[root@linux ~]# jobs [-lrs]
参数:
-l :除了列出 job number 之外,同时列出 PID
-r :仅列出正在背景 run 的工作;
-s :仅列出正在背景当中暂停 (stop) 的工作。
范例:
范例一:观察目前的 bash 当中,所有的工作,与对应的 PID
[root@linux ~]# jobs -l
[1]+ 24988 Stopped /usr/bin/vim ~/.bashrc
[2]- 25006 Stopped /usr/bin/vim ~/.bash_history

4、将背景工作拿到前景来处理:fg
[root@linux ~]# fg %jobnumber
参数:
%jobnumber :工作的号码。注意,那个 % 是可有可无的!
范例:
范例一:先以 jobs 观察工作,再将工作取出:
[root@linux ~]# jobs
[1]+ Stopped /usr/bin/vim ~/.bashrc
[2]- Stopped /usr/bin/vim ~/.bash_history
[root@linux ~]# fg <==预设取出那个 + 的工作,亦即 [1]
[root@linux ~]# fg %2 <==直接规定取出的那个工作号码!

5、让工作在背景下进行: bg
范例一:一执行 find / -perm +7000 后,立刻丢到背景去暂停!
[root@linux ~]# find / -perm +7000
# 此时,请立刻按下 [ctrl]-z 暂停
[1]+ Stopped find / -perm +7000
[root@linux ~]#
范例二:让该工作在背景下进行,并且观察他 
[root@linux ~]# jobs ; bg %1 ; jobs
[1]+ Stopped find / -perm +7000
[1]+ find / -perm +7000 &
[1]+ Running find / -perm +7000 &

6、管理背景当中的工作:kill
[root@linux ~]# kill -signal %jobnumber
[root@linux ~]# kill -l
参数:
-l :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些?
signal :代表给予后面接的那个工作什么样的指示啰!用 man 7 signal 可知:
-1 :重新读取一次参数的设定档 (类似 reload);
-2 :代表与由键盘输入 [ctrl]-c 同样的动作;
-9 :立刻强制删除一个工作;
-15:以正常的程序方式终止一项工作。与 -9 是不一样的。
范例:
范例一:找出目前的 bash 环境下的背景工作,并将该工作删除。
[root@linux ~]# jobs
[1]+ Stopped vim bashrc
[root@linux ~]# kill -9 %1
[1]+ 已砍掉 vim bashrc
范例:找出目前的 bash 环境下的背景工作,并将该工作终止掉。
[root@linux ~]# jobs
[1]+ Stopped vim bashrc
[root@linux ~]# kill -SIGTERM %1
[1]+ 终止 vim bashrc
-SIGTERM与-15是一样的!您可以使用kill -l来查阅!
常见信号:
1 SIGHUP 代表『让该PID重新读取自己的设定档』,类似重新启动;
2 SIGINT 代表用键盘输入的 [ctrl]-c来中断一个程序的进行。
9 SIGKILL 代表强制中断一个程序的进行,如果该程序进行到一半,那么尚未完成的部分可能会有『半产品』产生,类似vim会有.filename.swp保留下来。
15 SIGTERM 以正常的结束程序来终止该程序。由于是正常的终止,所以后续的动作会将他完成。不过,如果该程序已经发生问题,就是无法使用正常的方法终止时,输入这个signal也是没有用的。

例子:
以ps找出syslog这个服务的PID后,再使用kill重新读取syslog的设定文件数据:
我们可以使用底下的方式找出syslog的PID!
ps aux | grep 'syslog' | grep -v 'grep'| awk '{print $2}'
接下来,再给予kill -SIGHUP的讯号至该PID ,所以,整个指令串可以这样写:
kill -SIGHUP `ps aux|grep 'syslog'|grep -v 'grep'|awk '{print $2}'`
然后立刻tail -n 5 /var/log/messages看看syslog有没有重新被启动啊?

7、killall
[root@linux ~]# killall [-iIe] [command name]
参数:
-i:interactive的意思,交互式的,若需要删除时,会出现提示字符给使用者;
-e:exact 的意思,表示『后面接的 command name 要一致』,但整个完整的指令不能超过 15 个字符。
-I :指令名称(可能含参数)忽略大小写。
范例一:给予syslogd这个指令启动的PID一个SIGHUP的讯号
[root@linux ~]# killall -1 syslogd
如果用ps aux仔细看一下,syslogd才是完整的指令名称。但若包含整个参数,则syslogd -m 0才是完整的呢!

范例二:强制终止所有以httpd启动的程序
[root@linux ~]# killall -9 httpd
总之,要删除某个程序,我们可以使用PID或者是启动该程序的指令名称, 而如果要删除某个服务呢?呵呵!最简单的方法就是利用killall,因为他可以将系统当中所有以某个指令名称启动的程序全部删除。举例来说,上面的范例二当中,系统内所有以httpd启动的程序,就会通通的被删除啦!

8、nice
我们的Linux可以在x86上面『同时进行多个工作』的呢!那么多个工作是如何进行的呢? 其实每个工作都会进入到CPU的工作排程当中,并等待CPU来执行, 而CPU会根据每个工作的优先执行序(priority)来判断谁比较重要, 所以某个工作就可能会比较优先被执行完毕啦! 也就是说, Linux 系统中,每个process都会拥有一个所的『优先执行序 (priority)』的属性,利用该属性来让CPU判断那个工作是比较重要的,那个工作在一群工作当中就会优先被执行,也让系统资源可以分配的更恰当。我们可以使用ps还观察优先执行序: 
[root@linux ~]# ps -l 
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 
0 S 0 18851 18827 0 77 0 - 1302 wait pts/0 00:00:00 su 
4 S 0 18852 18851 0 76 0 - 1349 wait pts/0 00:00:00 bash 
4 R 0 19510 18852 0 76 0 - 1111 - pts/0 00:00:00 ps 
其中,那个PRI就是Priority的简写,而NI是nice的简写,这两个东西是凑在一起才产生目前的PRI值的! PRI越小时,代表该程序可以具有『越早被优先执行』的意思,只是PRI是由系统动态产生的,并不会是一直固定的值。至于那个NI (nice)则是我们操作值额外给予的一个数值, 他可以影响PRI的值,基本上,他的相关性是这样的:PRI(new) = PRI(old) + nice,不过您要特别留意到,如果原本的PRI是50,并不是我们给予一个nice = 5,就会让PRI变成55! 因为PRI是系统『动态』决定的,所以,虽然nice值是可以影响PRI ,不过最终的PRI仍是要经过系统分析后才会决定的。另外,nice值是有正负的,而既然PRI越小越早被执行,所以,当nice值为负值时,那么该程序就会降低PRI值,亦即会变的较优先被处理。此外,您必须要留意到: 
1)一般使用者的nice值为:0 ~ 19; 
2)root可用的nice值为:-20 ~ 19; 
3)一般使用者仅可将nice值越调越高,如果本来nice为5,则未来仅能调整到大于5的nice; 
4)一般使用者仅能调整属于自己的程序的nice值。 
这也就是说,要调整某个程序的优先执行序,就是『调整该程序的nice值』啦!那么如何给予某个程序nice值呢?有两种方式,分别是: 
1)一开始执行程序就立即给予一个特定的nice值:用 nice 指令; 
2)调整某个已经存在的PID的nice值:用renice指令。

[root@linux ~]# nice [-n] command 
参数: 
-n:后面接一个数值,数值的范围:-20 ~ 19。 
范例一:用root给一个nice植为-5 ,用于执行vi ,并观察该程序! 
[root@linux ~]# nice -n -5 vi & 
[1] 19542 
[root@linux ~]# ps -l 
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 
0 S 0 18851 18827 0 77 0 - 1302 wait pts/0 00:00:00 su 
4 S 0 18852 18851 0 76 0 - 1349 wait pts/0 00:00:00 bash 
4 T 0 19542 18852 0 72 -5 - 1063 finish pts/0 00:00:00 vi 
4 R 0 19543 18852 0 77 0 - 1110 - pts/0 00:00:00 ps 
就如同前面说的,nice是用来调整程序的执行优先级!这里只是一个执行的范例罢了!通常什么时候要将nice值调大呢?举例来说,系统的背景工作中,某些比较不重要的程序之进行:例如备份工作!由于备份工作相当的耗系统资源,这个时候就可以将备份的指令之nice值调大一些,可以使系统的支持分配的更为公平!

9、renice
[root@linux ~]# renice [number] PID 
参数: 
PID:某个程序的ID 
范例一:以上面nice范例中ps -l的结果,将18852那个PID修改nice为10 
[root@linux ~]# renice 10 18852 
18852: old priority 0, new priority 10 
[root@linux ~]# ps -l 
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 
0 S 0 18851 18827 0 77 0 - 1302 wait pts/0 00:00:00 su 
4 S 0 18852 18851 0 85 10 - 1349 wait pts/0 00:00:00 bash 
4 R 0 19593 18852 0 87 10 - 1111 - pts/0 00:00:00 ps 
如果要调整的是已经存在的某个process的话,那么就得要使用 renice 了。使用的方法很简单,renice后面接上数值及PID即可

10、dmesg

在开机的时候你会发现有很多的讯息出现吧,例如CPU的形式、硬盘、光盘型号及硬盘分割表等等,这些信息的产生都是核心(kernel)在进行硬件的测试与驱动啦。但讯息都是『刷』的一声就跑过去了!完全来不及看!
这些讯息有时候对于系统管理员是很重要的,因为他提供了系统的信息呀!要看这些讯息你可以用dmesg这个指令来观看
范例一:输出所有的核心开机时的信息
[root@linux ~]# dmesg | more

范例二:搜寻开机的时候,硬盘的相关信息为何?
[root@linux ~]# dmesg | grep -i hd
ide0: BM-DMA at 0xffa0-0xffa7, BIOS settings: hda:DMA, hdb:DMA
ide1: BM-DMA at 0xffa8-0xffaf, BIOS settings: hdc:DMA, hdd:pio
hda: ST320430A, ATA DISK drive
hdb: Maxtor 5T030H3, ATA DISK drive
hdc: CD-540E, ATAPI CD/DVD-ROM drive
.....底下省略.....

11、lspci
   lspci可以直接将/proc下的关于PCI接口的各项数据一口气的将他完整的呈现在你面前,可以让您很快速的了解到核心所侦测到的你的主机硬件。 
[root@linux ~]# lspci [-vvn] 
参数: 
-v:观察更多的PCI装置的信息; 
-vv:比-v还要更详细的细部信息; 
-n:直接观察PCI的ID而不是厂商名称 
范例一:查阅您系统内的PCI装置: 
[root@linux ~]# lspci 
00:00.0 Host bridge: VIA Technologies, Inc. VT82C693A/694x [Apollo PRO133x] (rev c4) 
00:01.0 PCI bridge: VIA Technologies, Inc. VT82C598/694x [Apollo MVP3/Pro133x AGP] 
.....(中间省略)..... 
00:0c.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10) 
01:00.0 VGA compatible controller: nVidia Corporation NV17 [GeForce4 MX 440] (rev a3) 
   不必加任何的参数,就能够显示出目前主机上面的各个 PCI 接口的装置,从上面的数据可以看出我的显示卡是Nvidia的,主机芯片则是VIA的,网络卡则是Realtek 的8139 (亦即是螃蟹卡)。 
   其实那就是我们的硬件侦测的数据可以对照着底下这个档案来查阅:/usr/share/hwdata/pci.ids,就是PCI的标准ID与厂牌名称的对应表。此外,刚刚我们使用lspci时,其实所有的数据都是由/proc/bus/pci/目录下的数据所取出的。

12、uname
[root@linux ~]# uname [-asrmpi]
常用参数:
-a :所有系统相关的信息;
-s :系统核心名称
-r :核心的版本
-m :本系统的硬件名称
-p :CPU 的类型
-i :硬件的平台 (ix86)
范例一:输出系统的基本信息
[root@linux ~]# uname -a
Linux linux.site 2.6.12-1.1398_FC4 #1 Fri Jul 15 00:52:32 EDT 2005 i686 i686 i386 GNU/Linux
uname可以列出目前系统的核心版本、主要硬件平台以及CPU类型等等的信息。以上面范例一的状态来说,我的Linux主机使用的核心名称为Linux,而主机名称为 linux.site,核心的版本为2.6.12-1.1398_FC4,该核心版本建立的日期为2005/07/15, 适用的硬件平台为i386以上等级的硬件平台。

13、strace
    常用来跟踪进程执行时的系统调用和所接收的信号。在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
参数:
-c    统计每一系统调用的所执行的时间,次数和出错的次数等.
-d    输出strace关于标准错误的调试信息.
-f    跟踪由fork调用所产生的子进程.
-ff    如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.
-F    尝试跟踪vfork调用.在-f时,vfork不被跟踪.
-h    输出简要的帮助信息.
-i    输出系统调用的入口指针.
-q    禁止输出关于脱离的消息.
-r    打印出相对时间关于,,每一个系统调用.
-t    在输出中的每一行前加上时间信息.
-tt    在输出中的每一行前加上时间信息,微秒级.
-ttt    微秒级输出,以秒了表示时间.
-T    显示每一调用所耗的时间.
-v    输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出.
-V    输出strace的版本信息.
-x    以十六进制形式输出非标准字符串
-xx    所有字符串以十六进制形式输出.
-a column    设置返回值的输出位置.默认 为40.
-e expr    指定一个表达式,用来控制如何跟踪.格式如下:
[qualifier=][!]value1[,value2]...
qualifier只能是trace,abbrev,verbose,raw,signal,read,write其中之一.value是用来限定的符号或数字.默认的qualifier是trace.感叹号是否定符号.例如: -e open   等价于-e trace=open,表示只跟踪open调用.而-etrace!=open表示跟踪除了open以外的其他调用.有两个特殊的符号all和none.
注意有些shell使用!来执行历史记录里的命令,所以要使用\.
-e trace=set    只跟踪指定的系统 调用.例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用.默认的为set=all.
-e trace=file   只跟踪有关文件操作的系统调用.
-e trace=process   只跟踪有关进程控制的系统调用.
-e trace=network    跟踪与网络有关的所有系统调用.
-e strace=signal    跟踪所有与系统信号有关的 系统调用
-e trace=ipc    跟踪所有与进程通讯有关的系统调用
-e abbrev=set    设定strace输出的系统调用的结果集.-v等与abbrev=none.默认为abbrev=all.
-e raw=set    将指定的系统调用的参数以十六进制显示.
-e signal=set    指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号.
-e read=set    输出从指定文件中读出 的数据.例如:
-e read=3,5
-e write=set    输出写入到指定文件中的数据.
-o filename    将strace的输出写入文件filename
-p pid    跟踪指定的进程pid.
-s strsize    指定输出的字符串的最大长度.默认为32.文件名一直全部输出.
-u username    以username的UID和GID执行被跟踪的命令

输出:
root@ubuntu:/usr# strace cat /dev/null
execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0
brk(0)                                  = 0xab1000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
...
brk(0) = 0xab1000
brk(0xad2000) = 0xad2000
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
open("/dev/null", O_RDONLY) = 3
fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
read(3, "", 32768) = 0
close(3) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
   每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。

1)通用的用法
strace -o output.txt -T -tt -e trace=all -p 28979
   跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面。

2)程序调试
strace -o whoami-strace.txt whoami
strace -f -F -o ~/dcop-strace.txt dcopserver
   这里-f -F选项告诉strace同时跟踪fork和vfork出来的进程,-o选项把所有strace输出写到~/dcop-strace.txt里面,dcopserver是要启动和调试的程序。

14、pgrep/pkill
   进程查找/杀掉命令。查找和杀死指定的进程, 他们的选项和参数完全相同, 这里只是介绍pgrep。
参数:
-d     定义多个进程之间的分隔符, 如果不定义则使用换行符。
-n     表示如果该程序有多个进程正在运行,则仅查找最新的,即最后启动的。
-o     表示如果该程序有多个进程正在运行,则仅查找最老的,即最先启动的。
-G     其后跟着一组group id,该命令在搜索时,仅考虑group列表中的进程。
-u     其后跟着一组有效用户ID(effetive user id),该命令在搜索时,仅考虑该effective user列表中的进程。
-U     其后跟着一组实际用户ID(real user id),该命令在搜索时,仅考虑该real user列表中的进程。
-x     表示进程的名字必须完全匹配, 以上的选项均可以部分匹配。
-l     将不仅打印pid,也打印进程名。
-f     一般与-l合用, 将打印进程的参数。

用法举例:

1)查找进程名为sleep的进程,同时输出所有找到的pid
pgrep sleep
    3456
    3457

2)查找进程名为sleep的进程pid,如果存在多个,他们之间使用:分隔,而不是换行符分隔。
pgrep -d: sleep
    3456:3457

3)查找进程名为sleep的进程pid,如果存在多个,这里只是输出最后启动的那一个。
pgrep -n sleep
    3457

4)查找进程名为sleep的进程pid,如果存在多个,这里只是输出最先启动的那一个。
pgrep -o  sleep
    3456

5)查找进程名为sleep,同时这个正在运行的进程的组为root和stephen。
pgrep -G root,stephen sleep
    3456
    3457

6)查找有效用户ID为root和oracle,进程名为sleep的进程。
pgrep -u root,oracle sleep
    3456
    3457

7)查找实际用户ID为root和oracle,进程名为sleep的进程。
pgrep -U root,oracle sleep
    3456
    3457

8)查找进程名为sleep的进程,注意这里找到的进程名必须和参数中的完全匹配。
pgrep -x sleep
    3456
    3457

9)查找进程名为sleep的进程,同时输出所有找到的pid和进程名。   
pgrep -l sleep
    3456 sleep
    3457 sleep

10)查找进程名为sleep的进程,同时输出所有找到的pid、进程名和启动时的参数。
pgrep -lf sleep
    3456 sleep 1000
    3457 sleep 1000

11)查找进程名为sleep的进程,同时以逗号为分隔符输出他们的pid,在将结果传给ps命令,-f表示显示完整格式,-p显示pid列表,ps将只是输出该列表内的进程数据。
pgrep -f sleep -d, | xargs ps -fp
    UID        PID  PPID  C STIME TTY          TIME CMD
    root      3456  2138  0 06:11 pts/5    00:00:00 sleep 1000
    root      3457  2138  0 06:11 pts/5    00:00:00 sleep 1000 

15、df
   报告磁盘空间使用状况。该命令最为常用的选项就是-h,该选项将智能的输出数据单位,以便使输出的结果更具可读性。
参数:
-a 显示所有文件系统的磁盘使用情况,包括0块(block)的文件系统,如/proc文件系统。 
-k 以k字节为单位显示。 
-i 显示i节点信息,而不是磁盘块。 
-t 显示各指定类型的文件系统的磁盘空间使用情况。 
-x 列出不是某一指定类型文件系统的磁盘空间使用情况(与t选项相反)。 
-T 显示文件系统类型。

用法举例:
1)列出各文件系统的磁盘空间使用情况。 
df 

Filesystem  1K-blocks  Used    Available  Use%   Mounted on 
/dev/hda2   1361587    1246406  44823      97%   / 

第1列   代表文件系统对应的设备文件的路径名(一般是硬盘上的分区);
第2列   给出分区包含的数据块(1024字节)的数目;
第3、4列   分别表示已用的和可用的数据块数目。用户也许会感到奇怪的是,第3,4列块数之和不等于第2列中的块数。这是因为缺省的每个分区都留了少量空间供系统管理员使用。即使遇到普通用户空间已满的情况,管理员仍能登录和留有解决问题所需的工作空间。
Use%列   表示普通用户空间使用的百分比,即使这一数字达到100%,分区仍然留有系统管理员使用的空间。
Mounted on列   表示文件系统的安装点。 
  

2)列出各文件系统的i节点使用情况。 
df -ia 

Filesystem Inodes IUsed IFree  Iused% Mounted on 
/dev/hda2  352256 75043 277213  21%   / 
none       0      0     0       0%    /proc 
localhost:(pid221) 0 0 0       0%   /net 
  
3)列出文件系统的类型。 
df -T 

Filesystem Type 1K-blocks Used    Available use% Mounted on 
/dev/hda2  ext2 1361587   1246405 44824      97%  / 

16、du
   评估磁盘的使用状况。
参数:
-a  包括了所有的文件,而不只是目录。
-b  以字节为计算单位。
-k  以千字节(KB)为计算单位。
-m  以兆字节(MB)为计算单位。
-g  以GB为计算单位。
-h  是输出的信息更易于阅读。
-s  只显示工作目录所占总空间。
--exclude=PATTERN   排除掉符合样式的文件,Pattern就是普通的Shell样式,?表示任何一个字符,*表示任意多个字符。
--max-depth=N      从当前目录算起,目录深度大于N的子目录将不被计算,该选项不能和s选项同时存在。

用法举例:
1)仅显示子一级目录的信息。
du --max-depth=1 -h
246M    ./stephen
246M    . 
2)获取当前目录下所有子目录所占用的磁盘空间大小。
du -sh ./*   #
352K    ./MemcachedTest
132K    ./Test
33M     ./thirdparty  
3)在当前目录下,排除目录名模式为Te*的子目录(./Test),输出其他子目录占用的磁盘空间大小。
du --exclude=Te* -sh ./* 
352K    ./MemcachedTest
33M     ./thirdparty

17、pmap(report memory map of a process)

    查看进程的内存映像信息
pmap [ -x | -d ] [ -q ] pids...
pmap -V
参数:
-x   extended       Show the extended format    显示扩展格式
-d   device         Show the device format      显示设备格式
-q   quiet          Do not display some header/footer lines    不显示头尾行
-V   show version   Displays version of program    显示版本

扩展格式和设备格式域:
Address:进程所占的地址空间
Kbytes:该虚拟段的大小
RSS:设备号(主设备:次设备)
Anon:设备的节点号,0表示没有节点与内存相对应
Locked:是否允许swapped
Mode 权限:r=read, w=write, x=execute, s=shared, p=private(copy on write)
Mapping:bash 对应的映像文件名
Dirty:  脏页大小
Offset: 文件偏移
Device: 设备名

1)查看进程1的设备格式
[root@C44 ~]#  pmap -d 1
1:   init [5]                   
Address   Kbytes Mode  Offset           Device    Mapping
00934000      88 r-x-- 0000000000000000 008:00005 ld-2.3.4.so
0094a000       4 r---- 0000000000015000 008:00005 ld-2.3.4.so
0094b000       4 rw--- 0000000000016000 008:00005 ld-2.3.4.so
0094e000    1188 r-x-- 0000000000000000 008:00005 libc-2.3.4.so
00a77000       8 r---- 0000000000129000 008:00005 libc-2.3.4.so
00a79000       8 rw--- 000000000012b000 008:00005 libc-2.3.4.so
00a7b000       8 rw--- 0000000000a7b000 000:00000   [ anon ]
00a85000      52 r-x-- 0000000000000000 008:00005 libsepol.so.1
00a92000       4 rw--- 000000000000c000 008:00005 libsepol.so.1
00a93000      32 rw--- 0000000000a93000 000:00000   [ anon ]
00d9d000      52 r-x-- 0000000000000000 008:00005 libselinux.so.1
00daa000       4 rw--- 000000000000d000 008:00005 libselinux.so.1
08048000      28 r-x-- 0000000000000000 008:00005 init
0804f000       4 rw--- 0000000000007000 008:00005 init
084e1000     132 rw--- 00000000084e1000 000:00000   [ anon ]
b7f5d000       8 rw--- 00000000b7f5d000 000:00000   [ anon ]
bffee000      72 rw--- 00000000bffee000 000:00000   [ stack ]
ffffe000       4 ----- 0000000000000000 000:00000   [ anon ]
mapped: 1700K    writeable/private: 276K    shared: 0K
最后一行的值:
mapped    表示该进程映射的虚拟地址空间大小,也就是该进程预先分配的虚拟内存大小,即ps出的vsz
writeable/private     表示进程所占用的私有地址空间大小,也就是该进程实际使用的内存大小     
shared    表示进程和其他进程共享的内存大小

2)查看进程1的设备格式,不显示头尾行
[root@C44 ~]#  pmap -d -q 1

3)查看进程1的扩展格式
[root@C44 ~]#  pmap -x 1

4)循环显示进程3066的设备格式的最后1行,间隔2秒显示一次
[root@C44 ~]#  while true; do pmap -d  3066 | tail -1; sleep 2; done

18、hdparm:观察硬盘的种种信息

原文地址:https://www.cnblogs.com/defias/p/3432581.html