Linux之进程管理(2)相关命令之一
procps工具命令对进程管理的使用: ps pgrep pidof pkill pstree
ps 命令
ps (Process State) :report a snapshot of the current processes.
查看当前进程的快照信息表
此命令支持3种风格:
1、SysV风格:选项前必须加-符号,如ps -ef
2、BSD风格:选项前可以不加-符号,如ps aux
3、GUN风格:之前两个-符号,类似长选项,如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],... 制定特定进程属性信息:
pid、comm、%cpu、%mem、state、tty、euser、ruser
注:特定属性的选项,很多,对应的表示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= 注:-q为quick 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
#显示所有进程并显示进程执行用户、内存的等信息
[root@mageedu init.d]# ps aux | head -n 10
#显示所有进程信息,并显示对应的进程树状结构
[root@mageedu init.d]# ps axjf | head -n 10
#显示线程信息
[root@mageedu init.d]# ps axms | head -n 10
#获取进程的安全信息(SElinux 安全上下文)
[root@mageedu init.d]# ps axZ | tail -n 10
#显示每个作为根用户运行的进程的(真实和有效ID)用户格式:
[root@mageedu init.d]# ps -U root -u root u | tail -n 10
#自定义显示所有进程的指定字段属性信息
[root@mageedu ~]# ps axo state,pid,euid,ruid,tty,tpgid,sess,pgrp,ppid,pcpu,comm | head -n 10
#显示特定服务或进程名字的信息
[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 : 显示完整进程格式的进程名称,注:(centos7上version3.3.10开始支持此选项)
实例:
根据模式显示完整的进程格式名称,命令版本不同的不同选项实现:
#在centos6中,默认procps进程管理软件包版本为3.2.8
[root@mzf ~]# pgrep -V pgrep (procps version 3.2.8)
#显示所有bash进程
[root@mzf ~]# pgrep -f '^\' -l 4370 -bash 5241 -bash
#显示所有以pickup开头的完整进程命令
[root@mzf ~]# pgrep -f '\#在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进程中生效者用户为root的PID
[root@mageedu ~]# pgrep -u root 'crond' 3494#显示named域名解析服务的进程编号已经其进程名称
[root@mageedu ~]# pgrep -u named -u named 'named' -l 5296 named#显示进程有效者为rpcuser和postfix的进程编号及命令名称
[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 '\#显示所有打开的bash进程的终端、PID、进程用户、有效用户、进程命令
[root@mzf ~]# for pid in `pgrep '\'`; 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#验证上面个数,下面列出了4个PID表示却是开启了4个bash进程
[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
解析:不加参数默认情况下,同一进程节点下的进程有相同名称的进程会自动合并,如上图中所示,其中红框部分表示有同名进程出现合并,比如”-6*[mingetty]”表示在init进程节点下,有6个mingetty进程,也就是负责切换终端时提供交互式登录界面的进程。而绿框部分的花括号及{}里表示父进程中子线程,比如rsyslogd日志服务提供了3个子线程。