Chinaunix首页 | 论坛 | 博客
  • 博客访问: 316481
  • 博文数量: 84
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 890
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-13 16:46
文章分类

全部博文(84)

文章存档

2017年(2)

2016年(4)

2015年(78)

我的朋友

分类: 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命令了。

阅读(1595) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~