分类: LINUX
2015-07-07 16:10:19
一、ps命令:将某个时间点的进程运行情况选取下来
ps aux #查看系统所有的进程数据
ps –lA #也是能够查看所有系统的数据
ps aujf #连同部分进程树状态
参数
-A:所有的进程均显示出来,与-e具有同样作用
-a:不予termail有关的所有进程;(是不是tty1~7呀?)
-u:有效用户(effective user)相关的进程;
x:通常与a这个参数一起使用,可列出较完整信息
输出格式规划
l:较长、详细地将PID的信息列出
j:工作的格式(jobs format)
-f:做一个更为完整的输出
可以选择直接背两个比较不同的参数,一是只查阅自己bash程序的ps –l,二是可以查看所有系统运行的程序ps aux,注意你没有看错,是ps aux,没有那个减号(-),如果加上减号是另外一个意思,因为ps有-a和a两个参数。
仅查看自己的bash相关进程:ps –l
将目前属于你自己这次登陆的PID与相关信息列出来(只与自己的bash有关) [root@RHEL6 ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 2483 2479 0 80 0 - 27107 wait pts/0 00:00:00 bash 4 R 0 2612 2483 0 80 0 - 27030 - pts/0 00:00:00 ps [root@RHEL6 ~]# |
使用ps –l仅列出与你的操作环境(bash)有关的进程,即上层的父进程回事你自己的bash,而没有扩展到init这个进程去,ps –l显示的数据如下
F:代表这个进程标志(process flags),说明这个进程的权限,常见码有:
4表示此进程的权限为root;
1则表示此子进程仅可进行复制(fork)而无法实际执行(exec)
S:代表这个进程的状态(STAT)
R(Running)该程序正在运行
S(Sleep)该进程目前正在睡眠状态(idle),但可以被唤醒(signal)
D:不可被唤醒的睡眠状态,通常这个进程可能在等待I/O的情况(ex>打印)
T:停止状态(STOP),可能是在工作控制(后台暂停)或出错(traced)状态
Z:(zombie)[?z?mbi]僵尸状态,进程已经终止但却无法被删除至内存外。
UID/PID/PPID:代表此进程被该UID所拥有,进程的PID号码,此进程的父进程PID号码
C:代表CPU使用率,单位为百分比
PRI/NI:Priority/Nice的缩写,代表此进程被CPU所执行的优先级,数值越小代表该进程越快被CPU执行。
ADDR/SZ/WCHAN:都与内存有关,ADDR是kernel function,指出该进程在内存的那个部分,如果是个running的进程,一般会显示"-"。SZ代表进程用掉多少内存/WCHAN表示目前进程是否运行中,同样,若为-表示正在运行中。
TTY:登陆者的终端机位置
TIME:使用掉CPU时间,是此进程实际花费CPU运行时间。
CMD:就是command的缩写,造成此进程的触发进程的命令。
查看系统所有进程:ps aux
[root@RHEL6 ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.1 0.0 19360 1516 ? Ss 21:47 0:02 /sbin/init root 29 0.0 0.0 0 0 ? SN 21:47 0:00 [ksmd] root 426 0.0 0.0 11464 1480 ? S<s 21:47 0:00 /sbin/udevd -d root 830 0.0 0.1 12640 2952 ? S< 21:48 0:00 /sbin/udevd -d root 1299 0.2 0.2 185924 4588 ? Sl 21:48 0:04 /usr/sbin/vmtoolsd root 1379 0.0 0.0 27636 828 ? S<sl 21:48 0:00 auditd root 1395 0.0 0.0 249076 1628 ? Sl 21:48 0:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5 dbus 1412 0.0 0.0 31644 1148 ? Ssl 21:48 0:00 dbus-daemon --system root 1450 0.0 0.0 64116 1188 ? Ss 21:48 0:00 /usr/sbin/sshd root 1585 0.0 0.0 4060 576 tty6 Ss+ 21:48 0:00 /sbin/mingetty /dev/tty6 postfix 1801 0.0 0.1 78800 3232 ? S 21:50 0:00 pickup -l -t fifo -u root 1804 0.0 0.2 97860 3852 ? Ss 21:57 0:00 sshd: root@pts/0 root 1808 0.0 0.1 108296 2008 pts/0 Ss 21:57 0:00 -bash root 1837 0.0 0.0 110224 1164 pts/0 R+ 22:21 0:00 ps aux [root@RHEL6 ~]# |
各字段意义为:
USER:该警察属于哪个用户账号
PID:该井的进程标识符
%CPU:该京城使用掉的CPU资源百分比
%MEM:该进程所占用的物理内存百分比
VSZ:该京城使用掉的虚拟内存量(KB)
RSS:该进程占用的固定的内存量(KB)
TTY:该进程是在那个终端上面运行,若与终端机无关(系统内部)则显示"?"
STAT:该进程目前的状态,主要有R/S/T/Z。如上图还有很多其他状态,可参考man ps了
TIME:该进程实际使用CPU运行的时间(该进程启动的时间)
COMMAND:该进程的实际命令
继续使用ps来查看一下其他的信息吧
ps –l表示仅查看自己的bash相关进程,而ps –lA表示所有的进程以长格式(-l)均显示出来
[root@RHEL6 ~]# ps -lA F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1 0 0 80 0 - 4840 poll_s ? 00:00:02 init 1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd 1 S 0 3 2 0 -40 - - 0 migrat ? 00:00:00 migration/0 1 S 0 4 2 0 80 0 - 0 ksofti ? 00:00:00 ksoftirqd/0 1 S 0 5 2 0 -40 - - 0 cpu_st ? 00:00:00 migration/0 5 S 0 6 2 0 -40 - - 0 watchd ? 00:00:00 watchdog/0 1 S 0 7 2 0 80 0 - 0 worker ? 00:00:04 events/0 1 S 0 8 2 0 80 0 - 0 worker ? 00:00:00 cgroup 1 S 0 9 2 0 80 0 - 0 worker ? 00:00:00 khelper 1 S 0 10 2 0 80 0 - 0 worker ? 00:00:00 netns
列出类似进程树的程序显示 [root@RHEL6 ~]# ps axjf PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 1 1450 1450 1450 ? -1 Ss 0 0:00 /usr/sbin/sshd 1450 1804 1804 1804 ? -1 Ss 0 0:00 \_ sshd: root@pts/0 1804 1808 1808 1808 pts/0 1971 Ss 0 0:00 \_ -bash 1808 1971 1971 1808 pts/0 1971 R+ 0 0:00 \_ ps axjf 1 1527 1527 1527 ? -1 Ss 0 0:00 /usr/libexec/postfix/master 1527 1535 1527 1527 ? -1 S 89 0:00 \_ qmgr -l -t fifo -u 1527 1801 1527 1527 ? -1 S 89 0:00 \_ pickup -l -t fifo -u 1 1537 1537 1537 ? -1 Ss 0 0:01 crond 1 1548 1548 1548 ? -1 Ss 0 0:00 /usr/sbin/atd 1 1561 1561 1561 ? -1 Ss 0 0:00 /usr/bin/rhsmcertd 1 1575 1575 1575 ? -1 Ss 0 0:00 login -- root 1575 1909 1909 1909 tty1 1909 Ss+ 0 0:00 \_ -bash |
从上面的例子可以看出进程之间是后相关性的,也可以使用pstree来达成这个进程树,以上面黄色部分来看,我是通过sshd的网络服务取得一个进程,该进程提供bash给我使用,而我通过bash再去执行ps axjf!
找出cron与syslog'这两个服务有关的PID号码
[root@RHEL6 ~]# ps aux | egrep '(cron|syslog)' root 1395 0.0 0.0 249076 1628 ? Sl 21:48 0:00 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5 root 1537 0.0 0.0 117208 1384 ? Ss 21:48 0:01 crond root 1973 0.0 0.0 101008 856 pts/0 S+ 22:57 0:00 egrep (cron|syslog) |
除此之外,我们必须要注意僵尸(zombie)进程,僵尸进程(ps aux中状态位STAT是Z,CMD位命令后面还接上了defunct是,就代表是僵尸进程)产生的原因很多,如果你发现系统中很多僵尸进程时,要找出该进程的父进程,然后好好做个跟踪,好好进行主机的环境优化,看看有什么需要优化的,不要只是杀掉他。
二、top命令:动态查看进程的变化
相对ps是选取一个时间点的进程状态,top则可以持续检测进程运行状态。
top命令语法
top [-d 数字]
top [-bnp]
参数:
-d:后面可以接秒杀,就是整个进程界面更新的秒数,默认是5秒
-b:以批次的方式执行top,还有更多的参数可以使用,通常会搭配数据流重定向来将壁橱里的结果输出成文件。
-n:与-b搭配,意义是需要进行几次top的输出结果。
-p:指定某个PID来进行查看监控而已
在top执行过程当中可以使用的常用命令:
?:显示在top当中可以输入的按键命令
P:以cpu的使用资源排序显示;
M:以内存的使用资源排序显示;
N:以PID来排序
T:由该进程使用过的CPU时间累积(TIME+)排序;
k:给予某个PID一个信号(signal)
r:给予某个PID重新制定一个nice值;
q:离开top软件的按键
top命令使用与命令界面
每两秒更新一次top,查看整体信息: [root@RHEL6 ~]# top -d 2 top - 09:24:49 up 37 min, 1 user, load average: 0.00, 0.00, 0.00(高于1要注意系统的压力) Tasks: 75 total, 1 running, 74 sleeping, 0 stopped, 0 zombie(僵尸进程数) Cpu(s): 0.5%us, 0.5%sy, 0.0%ni, 99.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1914688k total, 216028k used, 1698660k free, 23808k buffers Swap: 4194296k total, 0k used, 4194296k free, 64972k cached ?==如果加入k或r时,就会有相关的字样出现在这里 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1559 root 20 0 97856 3868 2928 S 2.9 0.2 0:10.79 sshd 1743 root 20 0 15012 1284 1008 R 1.0 0.1 0:00.20 top 1269 root 20 0 181m 4604 3668 S 0.5 0.2 0:09.19 vmtoolsd 1 root 20 0 19360 1520 1216 S 0.0 0.1 0:02.19 init |
不同于ps是静态的结果输出,top这个程序可以持续监控呢整个系统的进程工作状态。top主要分为两个界面,上面的界面为整个系统的资源使用状,基本上共有六行:
第一行(top…),
09:24:49 |
系统当前时间 |
up 37 min |
开机到目前为止所经过的时间 |
1 user |
已经登录系统的用户人数 |
load average: 0.00, 0.00, 0.00 |
系统在1/5/15分钟平均工作负载,batch工作方式为负载小于0.8就是这个负载代表1、5、15分钟,系统平均要负责运行几个进程工作的意思,数值越小代表系统越空闲,若高于1得要注意你的系统压力是否太过繁忙。 |
第二行(tasks),显示的是目前进程的总量与个别进程在什么状态,比较需要注意的是最后的zombie那个数值,如果不是0,就需要好好看看到底是哪个process变成僵尸了!
75 total |
进程总数 |
1 running |
正在运行的进程数 |
74 sleeping |
睡眠的进程数 |
0 stopped |
停止的进程数 |
0 zombie |
僵尸进程数 |
第三行(cpu(s)),显示的是CPU的整体负载,每个选项可以用"?"查阅,怎么查?当有多个CPU时,这些内容可能会超过两行。
0.5%us |
用户空间占用CPU百分比 |
0.5%sy |
内核空间占用CPU百分比 |
0.0%ni |
用户进程空间内改变过优先级的进程占用CPU百分比 |
99.0%id |
空闲CPU百分比 |
0.0%wa |
等待输入输出(I/O)的CPU时间百分比,通常你的系统会变慢都是I/O产生的问题比较大。 |
0.0%hi |
|
0.0%si |
|
0.0%st |
第四五行,表示目前的物理内存与虚拟内存(Mem/Swap)的使用情况。要注意的是swap的使用量尽量小,如果swap被大量使用,表示系统的物理内存不足!
第六行,这个是在top进程当中输入命令时显示状态的地方
top下半部分的界面,则是每个进程使用的资源情况,比较需要注意的是
PID |
每个进程的ID |
USER |
该进程所属的用户 |
PR |
priority的简写,进程的优先级执行顺序,越小越早被执行 |
NI |
Nice的简写,与Priority有关,也是越小越早被执行,负值表示高优先级,正值表示低优先级 |
VIRT |
进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES |
RES |
进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA |
%CPU |
上次更新到现在的CPU时间占用百分比 |
%MEM |
进程使用的物理内存百分比 |
TIME+ |
进程使用的CPU时间总计,单位1/100秒 |
COMMAND |
命令名/命令行 |
top默认使用CPU使用率(%CPU)作为排序的重点,如果想要使用内存使用率排序,则可以按下M,若要恢复则按下P键即可。如果想要将top的结果输出成为文件时,可以这样
将top的信息进行2次(默认是不是5秒,也可以改成10秒吧,像下面这样),然后将结果输出到top.txt [root@RHEL6 ~]# top -d 10 -b -n 2 > top.txt |
查看关注单一进程(用于要查看的进程CPU与内存使用率都很低,结果老是无法再第一行显示时)
[root@RHEL6 ~]# top -d 2 -p 1756 #查看关注单一进程 top - 10:35:50 up 1:48, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1914688k total, 216400k used, 1698288k free, 24452k buffers Swap: 4194296k total, 0k used, 4194296k free, 65072k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1756 postfix 20 0 78800 3236 2408 S 0.0 0.2 0:00.04 pickup (只显示这一行) |
修改NI参数
[root@RHEL6 ~]# top -d 2 -p 1756 top - 10:45:40 up 1:58, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.5%sy, 0.0%ni, 99.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1914688k total, 216524k used, 1698164k free, 24532k buffers Swap: 4194296k total, 0k used, 4194296k free, 65072k cached PID to renice:1756按下r后输入这个PID号码,注意下面原有PR值为20,NI值为0 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1756 postfix 20 0 78800 3236 2408 S 0.0 0.2 0:00.05 pickup
top - 10:45:40 up 1:58, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.5%sy, 0.0%ni, 99.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1914688k total, 216524k used, 1698164k free, 24532k buffers Swap: 4194296k total, 0k used, 4194296k free, 65072k cached Renice PID 1756 to value:10 完成上面的操作按回车后,状态栏会提示你键入nice值 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1756 postfix 20 0 78800 3236 2408 S 0.0 0.2 0:00.05 pickup
看下面nice值的变化与PR值的变化 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1756 postfix 30 10 78800 3236 2408 S 0.0 0.2 0:00.05 pickup |
三、pstree命令:查询进程之间的关系
pstree命令语法
pstree [-A|U] [-up]
参数:
-A:进程树之间的连接已ASCII字符来连接;
-U:个进程树之间的连接已utf8码的字符来连接,在某些终端接口下可能会有错误;
-p:同时列出每个进程的PID
-u:同时列出每个进程的所属账号名称
列出目前系统上面所有的进程树的相关性 [root@RHEL6 ~]# pstree -A init-+-atd |-auditd---{auditd} |-crond |-dbus-daemon---{dbus-daemon} |-master-+-pickup | `-qmgr |-6*[mingetty] #默认情况下,相似的进程会以数字显示,也就是有6个mingetty |-rhsmcertd |-rsyslogd---3*[{rsyslogd}] |-sshd---sshd---bash-+-pstree #这是我的操作进程,运行了pstree、2个top、1个vim | |-2*[top] | `-vim |-udevd---2*[udevd] `-vmtoolsd---{vmtoolsd} 同时显示出PID与users [root@RHEL6 ~]# pstree –pu init(1)─┬─atd(1518) ├─auditd(1349)───{auditd}(1350) ├─crond(1507) ├─dbus-daemon(1382,dbus)───{dbus-daemon}(1384) ├─master(1497)─┬─pickup(1756,postfix)#PID和owner │ └─qmgr(1504,postfix) ├─mingetty(1545) ├─mingetty(1547) ├─mingetty(1549) ├─mingetty(1552) ├─mingetty(1556) ├─mingetty(1558) ├─rhsmcertd(1531) ├─rsyslogd(1365)─┬─{rsyslogd}(1366) │ ├─{rsyslogd}(1368) │ └─{rsyslogd}(1369) ├─sshd(1420)───sshd(1559)───bash(1563)─┬─pstree(1787) │ ├─top(1780) 进程相似但PID不同 │ ├─top(1782) │ └─vim(1784) ├─udevd(426)─┬─udevd(1553) │ └─udevd(1554) └─vmtoolsd(1269)───{vmtoolsd}(1291) [root@RHEL6 ~]# 在括号()内的即是PID,以及该进程的owner,不过,由于我是时候已用那个root的身份执行此命令,所以属于root的进程都不会显示你出来啦 |
所有的进程都是衣服在init这个进程下面的,也就是我们提到的僵尸进程,为什么发生僵尸进程需要重新启动,因为init要重新启动,而重新启动init就是reboot。如果子进程挂点或者是老是杀不掉子进程,该如何找到父进程,就是这个pstree命令了。