Linux之进程管理(2)相关命令之一

procps工具命令对进程管理的使用:   ps   pgrep  pidof  pkill  pstree

ps  命令

ps  (Process State)  report a snapshot of the current processes.

查看当前进程的快照信息表

此命令支持3种风格:

     1SysV风格:选项前必须加-符号,如ps  -ef

     2BSD风格:选项前可以不加-符号,如ps  aux

     3GUN风格:之前两个-符号,类似长选项,如ps  --help

BSD风格选项使用:

     a   显示包括所有终端中的进程

     x   显示所有非终端中的进程

     u   选项中显示进程执行者、cpu、内存等信息

     f    选项中显示进程的父进程

     j    作业(jobs)控制方式

     r    只显示运行状态(R)的信息

     T    显示进程所处的终端,只有和终端相关的进程才会显示,否则TTY字段显示会空

     p  [pid],...  :指定pid显示,可以是pidlist,多个用,隔开,如  1,439,275

     q  [pid],...  quick ,快速根pid查找,(注意:cent5版本可能无法使用此选项)

     C  [cmdname],... :指定进程名称查询,可以是cmd列表,多个用,分开,如 sshd,syslod,crond

     o  [option],...  制定特定进程属性信息:

 pidcomm%cpu%memstatettyeuserruser

注:特定属性的选项,很多,对应的表示CODE已经其作用显示可以查看对应的man帮助文档,

搜索STANDARD FORMAT SPECIFIERS”关键字即可列出所有字段CODE及对应介绍。

常用的组合方式:

ps  ax :显示所有进程信息

ps  aux :显示所有进程并显示其进程发起者

ps  auxf :显示所有进程状态并显示进程的父进程

ps  axo  stat,euid,ruid,tty,tpgid,sess,pgrg,ppid,pid,pcpu,comm,pri,rtprio,ni

    状态,有效用户ID,发起用户ID,终端,进程组,会话,PID,cpu占用,使用的命令

SysV风格选项使用:

  -A  显示所有进程状态,同 -e 选项

  -e  显示所有进程状态,同 -A 选项

  -l   显示长格式信息

  -f  显示完整格式进程信息

  --no-headers  不显示头部的字段表示表示,如显示这些信息USER PID %CPU这一行(第一行)

常见用法命令组合:  

#BSD风格按标准格式显示所有进程基本信息:

ps  ax  

ps  axu

#SystV风格显示所有进程基本信息:

ps  -ef

ps  -elf

ps  -elF

ps  -elfy

#显示进程信息并显示其对应的进程树状(对应的父进程)结构

ps  -ejH                   注:-H表示为显示进程的阶层结构

ps  axjf

#显示进程中的线程信息:

ps  -eLf                   注:-L表示显示此进程线程的号码

ps  axms

#显示进程的基本信息及对应的SELinux安全上下文信息:

ps  -eo  euser,ruser,fuser,f,comm,label      注:label表示SELinux安全上下文

ps  -eM                             注:-M表示在进程信息中加入对应的安全上下文信息

ps  axZ                      注:Z选项作用同SystV风格中的-M选项

#显示每个作为root用户运行真实有效ID的信息格式:

ps  -u root -U root  u

#按进程的命令(CMDNAME)名称只显示进程的PID

ps  -C  syslod  -o  pid=           注:后面跟=符号表示只打印PID,不会打印其它附加信息及标题头

#按进程PID来显示进程对应的(CMDNAME)进程名

ps  p  43  o  comm=          

ps  -q  43  -o  comm=             注:-qquick mode快速查找模式,按PID,但是只针对3.2.8及以上版本的ps命令

#按指定关键字段来排序,使用k选项时,可以用[+|-]keyword表示按某一字段进行升序或降序排序

ps  axk  comm  o  comm,args             注:按所有的命令名称排序,并显示命令名称和命令参数

ps  ax  --sort  pid  o  comm,args        注:这里使用长选项--sort同样可以实现排序

ps  k -start_time  -ef             注:这里按进程的开启时间进程倒叙,显然1号进进程显示在最后一行

#显示进程的优先级、实时优先级

ps  axo  pri,psr,rtprio              注:pri(优先级)psr(cpu编号)rtprio(实时优先级,越大越高)

ps  axo  pid,pri,ni             注:ni表示nice值,越小优先级相对越高

 

 

进程信息表头字段CODE说明:

USER进程的发起者

PID进程号

%CPU进程所占用的cpu资源百分比

%MEM进程所占用的物理内存百分比

VSZ进程使用掉的虚拟内存大小,单位为kb

RSS进程占用的固定内存大小,单位为kb

TTY显示进程在哪个终端运行

STAT进程目前的状态

START进程被触发的时间(start_time)

COMMAND触发此进程的命令

 

进程状态对应的CODE说明:

BSD风格进程状态:

D   uninterruptible sleep   表示不可中断的睡眠(通常为IO来唤醒)

R   running or runnable     表示可运行(在运行队列)

S   interruptible sleep     可中断睡眠(等于一个进程结束后,无需其他IO随时可唤醒)

T   stopped by job          停止状态,不会被再次控制,需要手动发送信号启动

t   stopped by debugger     停止期间可被调试器跟踪

W   paging                  分页 (只支持2.6.XX以上内核)

X   dead                    被杀死

Z   zombie                  僵死状态,不能被其父进程回收

SysV风格:

<:高优先级进程

N:低优先级进程

+:前台进程,占据着某个终端

l:多线程进程

s:会话进程的首个进程(session leader

 

 

用法案例展示:

#显示所有进程

[root@mageedu init.d]# ps ax | head -n 10

 wKioL1fVGavAJGNQAAAaMhV-R7I780.png

#显示所有进程并显示进程执行用户、内存的等信息

[root@mageedu init.d]# ps aux | head -n 10

wKioL1fVGhXzhyPJAAAfcWbI4Is960.png

#显示所有进程信息,并显示对应的进程树状结构

[root@mageedu init.d]# ps axjf | head -n 10

wKiom1fVGiDThqHiAAAeav0oik0671.png 

#显示线程信息

[root@mageedu init.d]# ps axms | head -n 10

wKioL1fVGjOCcscSAAAv1EyU9R4311.png 

#获取进程的安全信息(SElinux 安全上下文)

[root@mageedu init.d]# ps axZ | tail -n 10

 wKioL1fVGkny4BeOAABKacLOQwQ840.png

#显示每个作为根用户运行的进程的(真实和有效ID)用户格式:

[root@mageedu init.d]# ps -U root -u root u | tail -n 10

wKiom1fVGl_T1hseAABAio_zoJg887.png

#自定义显示所有进程的指定字段属性信息

[root@mageedu ~]# ps axo state,pid,euid,ruid,tty,tpgid,sess,pgrp,ppid,pcpu,comm | head -n 10

wKioL1fVGn3CY9vlAAAfKWYckDM016.png 

#显示特定服务或进程名字的信息

[root@mageedu init.d]# ps -C sshd -o pid,comm
  PID COMMAND
 3407 sshd
11484 sshd

#指定多个进程出名称列出简要信息

[root@mageedu init.d]# ps -C sshd,syslogd,crond
  PID TTY          TIME CMD
 2928 ?        00:00:00 syslogd
 3407 ?        00:00:00 sshd
 3494 ?        00:00:00 crond
11484 ?        00:00:08 sshd

#只列出指定名称对应的PID

[root@mageedu init.d]# ps -C syslogd,crond -o pid=
 2928
 3494

#只列出对应PID的进程名称

[root@mageedu init.d]# ps -p 2928,3494 -o comm=
syslogd
crond

#使用quick mode快速模式对指定PID进程查找其进程名称

[root@localhost ~]# ps  -q  1302 -o comm=
sshd

注意:-q选项在centos5上好像不支持,centos5使用-p选项,子centos7上已经更新为了-q

 

 

pgrep 命令

pgrep:   look up or signal processes based on name and other attributes

根据名称或信号查找进程及其其它属性信息,支持正则表达式

命令格式:

pgrep  [options]...  PARTERN

      -u  [euid|euser] : 按指定进程真正生效者(effetvie user)来查找对应模式匹配的进程

      -U  [ruid|ruser]  : 按指定进程发起者(real user)来查找对应模式匹配的进程

      -t   [prefix] :按指定终端来查找对应模式进程,prefix格式为/dev/prefix,去掉/dev,如-t pts/0

      -P   [parentId] :显示指定进程的子进程进行模式匹配

      -l   : 列出进程对应的名称

      -f   : 按模式匹配完全对应位进程对应的名称及详细参数

      -c   : 统计模式匹配对应到的进程的总个数

      -a   :  显示完整进程格式的进程名称,注:(centos7version3.3.10开始支持此选项)

实例:

根据模式显示完整的进程格式名称,命令版本不同的不同选项实现:

#centos6中,默认procps进程管理软件包版本为3.2.8

[root@mzf ~]# pgrep -V
pgrep (procps version 3.2.8)

#显示所有bash进程

[root@mzf ~]# pgrep -f '^\<bash\>' -l
4370 -bash
5241 -bash

#显示所有以pickup开头的完整进程命令

[root@mzf ~]# pgrep -f '\<pickup.*' -l
5467 pickup -l -t fifo -u

#Centos7中使用procps-ng版本升级为3.3.10,增加了-a选项

[root@localhost ~]# pgrep -V
pgrep from procps-ng 3.3.10

#执行使用-a显示完整命令格式信息

[root@localhost ~]# pgrep -a -f '^sshd' 
27531 sshd: root@pts/0,pts/1

 

其它常见用法:

#显示crond进程中生效者用户为rootPID

[root@mageedu ~]# pgrep -u root 'crond'
3494

#显示named域名解析服务的进程编号已经其进程名称

[root@mageedu ~]# pgrep -u named -u named 'named' -l
5296 named

#显示进程有效者为rpcuserpostfix的进程编号及命令名称

[root@mzf ~]# pgrep -u rpcuser,postfix -l
1603 rpc.statd
1974 qmgr
5467 pickup

#显示和指定tty终端相关的前台进程

[root@mzf ~]# pgrep -t pts/1 -l
5241 bash
5697 vim

#显示指定PID进程下的子进程,注意:只会显示子进程,不会递归显示其子进程下的进程

[root@mzf ~]# pgrep -P 1725 -l
1828 hald-addon-inpu
1836 hald-addon-acpi

#显示所有切换登录界面的进程

[root@mzf ~]# pgrep -l -f '\<mingetty.*[0-9]$' 
2083 /sbin/mingetty /dev/tty1
2085 /sbin/mingetty /dev/tty2
2088 /sbin/mingetty /dev/tty3
2092 /sbin/mingetty /dev/tty4
2094 /sbin/mingetty /dev/tty5
2096 /sbin/mingetty /dev/tty6

#显示所有打开的bash进程的终端、PID、进程用户、有效用户、进程命令

[root@mzf ~]# for pid in `pgrep '\<bash\>'`; do ps -p ${pid} --no-headers  -o tty,pid,ruser,euser,comm;  done
pts/0      4370 root     root     bash
pts/1      5241 root     root     bash

#显示当前所在的进程组的第一个会话进程

[root@mzf ~]# pgrep -s 0 -l 
4370 bash

 

 

pidof  命令

pidof find the process ID of a running program.

根据运行进程的名称来查找对应的PID

选项及用法:

pidof  [options]  program  [program]...   注:多个进程名用空格隔开,如crond vim bash

-s    :只显示指定进程名称产生的第一个进程的进程PID

-o  omitpid :进程名称相同,过滤掉指定的PID,支持使用 -o %PPID表示过滤掉父进程

-c    :计算指定的进程个数

 

常见案例:

#显示crond进程的产生的PID

[root@mzf ~]# pidof crond
2007

#查看多个进程产生的PID

[root@mzf ~]# pidof crond man hald
2007 5871 1724

#显示当前的终端的第一个sshd远程连接

[root@mzf ~]# pidof -s sshd
4366

#显示当前shell进程组第一个会话进程

[root@localhost ~]# pidof -s  bash
27770

#显示当前的bash,过滤掉bash的父级知道当前未产生子bash进程的bash

[root@localhost ~]# pidof  -o %PPID  bash
27535

#查看当前开启的bash个数

[root@localhost ~]# pgrep -c bash
4

#验证上面个数,下面列出了4PID表示却是开启了4bash进程

[root@localhost ~]# pgrep  bash
27535
27770
27903
27914

 

pkill  命令

pkill (1)            - look up or signal processes based on name and other attributes

通过对根据模式找出的指定进程发送信号来对进程进行通信或调整,同样支持正则表达式

选项格式及用法:

pkill  [option]...  PARTERN

    -f, --full  :匹配PARTERN中完整的进程相关命令行及参数

    -u, --euid  [euid|euser] : 杀死指定进程真正生效者(effetvie user)来查找对应模式匹配的进程

    -U,--uid  [ruid|ruser]  : 杀死指定定进程发起者(real user)来查找对应模式匹配的进程

    -t,--terminal   [prefix] :杀死指定终端来查对应匹配模式进程,prefix格式为/dev/prefix,去掉/dev,如-t pts/0

    -P,--parent   [parentId] :显示指定进程的子进程进行模式匹配

    -c,--count   :发送信号后,打印出统计匹配的进程的格式

    -e:发送信号后打印并输出进程的名称及PID

 

常用的案例:

1、简单的单个进程终止

#查看当前打开的vim编辑器进程

[root@localhost ~]# pgrep vim -l
27967 vim

#杀掉所有vim进程

[root@localhost ~]# pkill vim

#vim编辑器退强制退出,下面显示进程杀死信号

Vim: Caught deadly signal TERM0,0-1         All
Vim: Finished.
Terminated

#杀死进程并打印其对应pid

[root@localhost ~]# pkill -e vim
vim killed (pid 27978)

 

2、杀死模式中匹配的进程完整命令行对应的所有进程

#打开一个额外终端进行tar进程模拟

[root@localhost ~]# tar -cvf - /* | tar -tvf -

#杀死匹配的tar进程,并显示指定模式匹配进程的个数

[root@localhost ~]# pkill -c -f '^tar.*-.*'
2

解析:这里显示了2,表示处理了两个tar进程命令,前面的模拟打包和后面的模拟列出。

 

3、直接杀掉后台进程

#再次测试打开一个额外终端进行tar进程模拟,并放入后台执行

[root@localhost ~]# tar -cvf - /* | tar -tvf - &

#直接杀死模式匹配的完整tar命令及参数进程

[root@localhost ~]# pkill -KILL -f '^tar.*-.*'

 

4、前后台的的进程处理及信号切换

#再次测试打开一个额外终端进行tar进程模拟

[root@localhost ~]# tar -cvf - /* | tar -tvf -

#发送19信号放入让tar进程放入后台休眠进入暂停状态,并打印处理结果

[root@localhost ~]# pkill -19 -e -f '^tar.*-.*'
tar killed (pid 5319)
tar killed (pid 5320)

#此时在测试的终端上按回车显示了tar命令已被放入后台

 
[1]+  Stopped                 tar -cvf - /* | tar -tvf -

#通过发送18信号让其回到前台继续运行

[root@localhost ~]# pkill -18 -e -f '^tar.*-.*'
tar killed (pid 5319)
tar killed (pid 5320)

#发送KILL信号来杀死进程

[root@localhost ~]# pkill -9 -e -f '^tar.*-.*'
tar killed (pid 5319)
tar killed (pid 5320)

解析:这里打印的PID是不会变的,两个tar进程都被杀死。

#再次回到测试终端查看当前作业,要快会显示进程被杀掉状态,否则杀死进程后不显示

[root@localhost ~]# jobs
[1]+  Killed                  tar -cvf - /* | tar -tvf -

解析:这里已经Killed说明被此进程已经被强制杀死。

 

pstree  命令

pstree  pstree - display a tree of processes

以树状结构显示进程

选项及介绍:

pstree  [options]

-a   :显示执行程序的命令与完整参数

-c   :取消同名程序,合并显示

-h   :对输出的结果进行处理,高亮显示正在执行的程序

-l    : 以长用法显示

-n   :以PID大小排序

-u   :显示UID信息

-G   :使用VT100终端编码显示

-U   :使用UTF-8(Unicode)编码显示

 

简单实例:

#显示当系统进程数

[root@mzf ~]# pstree

wKiom1fVG6aSyyBvAAAuAX4nbJg335.png 

解析:不加参数默认情况下,同一进程节点下的进程有相同名称的进程会自动合并,如上图中所示,其中红框部分表示有同名进程出现合并,比如-6*[mingetty]表示在init进程节点下,有6mingetty进程,也就是负责切换终端时提供交互式登录界面的进程。而绿框部分的花括号及{}里表示父进程中子线程,比如rsyslogd日志服务提供了3个子线程。