进程
进程
程序的执行实例就是进程,系统为进程分配一个唯一的数字标识符,就是进程ID(process ID)。
进程组
每个进程除了有一进程ID外,还属于一个进程组,进程组是一个或者多个进程的集合。每个进程组有一个唯一的进程组ID。
一般重定向会产生一个进程组,先执行两个重定向,然后通过ps,可以查看有两个进程组id,即2125和2177
shuanghu@shuanghu:tmp$ tail -f word.txt|grep test &
shuanghu@shuanghu:tmp$ tail -f a.log | grep adfs &
shuanghu@shuanghu:tmp$ ps -O pgid
PID PGID S TTY TIME COMMAND
2098 2098 S pts/0 00:00:00 bash
2125 2125 S pts/0 00:00:00 tail -f word.txt
2126 2125 S pts/0 00:00:00 grep --color=auto test
2177 2177 S pts/0 00:00:00 tail -f a.log
2178 2177 S pts/0 00:00:00 grep --color=auto adfs
2202 2202 R pts/0 00:00:00 ps -O pgid
会话
会话(session)是一个或多个进程组的集合;创建会话的进程,是新会话的会话首进程(session leader);会话首进程的进程组ID是会话ID
一个会话可以有一个控制终端(controlling terminal).通常是终端设备(在终端登录情况下)或伪终端设备(在网络登录情况下)
建立与控制终端连接的会话首进程被称为控制进程(controlling process)
一个会话中的几个进程组可被分成一个前台进程组(foreground process group)以及一个或多个后台进程组(backgroup process group)
进程用户ID
每个进程有三个user ID: RUID,EUID,SUID
RUID
RUID(Real User ID)在用户登录系统时,会从口令文件中获取一个用户ID,这个UID被称为RUID
RGID(Real Group ID)在用户登录系统时,会从口令文件中获取一个组ID,这个GID被称为RGUID
EUID
EUID(Effective Group ID) 和 EGID(Effective Group ID)
EUID和EGID一般是用于用户访问文件权限控制的。
通常RUID=EUID,RGID=EGID。
SUID(Saved User ID)
保存设置用户ID,作为effective user ID的副本,在执行exec调用时后能重新恢复原来的effectiv user ID
进程时间
进程时间,也称为CPU时间,用以度量进程使用的CPU资源,当度量一个进程的执行时间时,UNIX系统为一个进程维护了3个进程时间值:
1. 时钟时间指进程运行的总时间;
2. 用户CPU时间指进程执行用户指令所用的时间;
3. 系统CPU时间指进程执行内核程序所用时间,比如执行read或write的时间
在linux中,可以使用time命令进行查看
进程查看命令(ps命令)
ps 命令是用于查看系统进程信息。
默认不带参数的,只显示运行在当前控制台下的属于当前用户的进程。
shuanghu@shuanghu:~$ ps
PID TTY TIME CMD
2519 pts/9 00:00:00 bash
2531 pts/9 00:00:00 ps
参数简介
Linux下的GNU ps命令拥有非常多的参数。简直就是一个大杂烩。Linux下的GNU ps命令,按照参数的风格,ps命令支持三种不同风格的命令行参数:
- Unix风格的参数,前面加单破折线;例如 ps -ef
- BSD风格的参数,前面不加破折线;例如 ps axu
- GNU风格的长参数,前面加双破折线; 例如 ps –forest
三种风格的参数,有一些相似的,但也有些看似相同却结果不同的。例如ps aux与ps -aux 的含义是不同的。
ps aux 表示 打印基于用户的格式显示的所有进程
ps -aux 表示用户x的所有进程,如用户x不存在,则给出警告,然后打印内容和ps aux相同
常用参数
unix风格 | GNU风格 | BSD风格 | 含义 |
-A | ax | 显示所有进程 | |
-e | ax | 显示所有进程 | |
-a | 显示除守护进程和无终端进程外的所有进程 | ||
-d | 显示所有进程,除会话首进程(session leaders) | ||
-N | –deselect | 显示除满足特殊条件的所有进程 | |
-p pidlist | –pid | pid | 显示pid在pidlist里的进程,pidlist表示pid数组,多个用逗号分隔,如-p 123,124 |
-C cmdlist | 通过执行命令名称查找进程,显示执行命令在cmdlist里的进程 | ||
-G grplist | –Group | 通过进程组ID或进程组名称查找进程,显示进程组ID在grplist里的进程 | |
-g grplist | –group | 通过session或进程组ID在grplist里的进程 | |
-s sesslist | –sid | 通过session ID查找进程,显示session ID在sesslist里的进程 | |
-t ttylist | –tty | t | 通过控制终端id查找进程 |
-U userlist | –User | U | 通过用户ID(RUID)或名称查找进程 |
-u userlist | –user | 通过用户ID(EUID)或名称查找进程 | |
-o format | –format | O | 仅显示由format指定的列 |
-O format | 显示基本列和由format指定的列 | ||
-H | 显示进程继承树 | ||
–sort order | k | 将输出按指定列进行排序 | |
–forest | 用层级结构显示出进程和父进程之间的关系 | ||
-m | m | 显示进程的线程信息 |
进程格式化输出
在上面参数中,-O,-o参数都可以控制进程输出列信息。
控制代码 | 列头 | 描述 |
%cpu | %CPU | CPU使用信息 |
%mem | %MEM | 进程内存使用信息 |
args | COMMAND | 带执行参数的进程执行命令 |
cmd | CMD | 和args一样 |
command | COMMAND | 和args一样 |
comm | COMMAND | 进程执行命令名称 |
bsdstart | START | 进程开始执行的时间 |
bsdtime | TIME | 进程执行时间 |
pid | PID | 进程PID |
ppid | PPID | 父进程PID |
pgid | PGID | 进程组ID |
euid | EUID | EUID |
egid | EGID | 有效用户组ID(egid) |
gid | GID | 用户组ID |
进程状态
unix风格进程状态
状态名称 | 含义 |
0 | 正运行 |
R | 可以运行,等待运行 |
S | 在休眠 |
Z | 僵化,进程已结束,但父进程已不存在,没有响应 |
T | 停止 |
BSD 风格的进程状态
状态名称 | 含义 |
< | 进程运行在高优先级上 |
N | 进程运行在低优先级上 |
L | 进程有页面锁定在内存中 |
s | 进程是个控制进程 |
l | 进程是多线程 |
+ | 进程运行在前端 |
常用用法
批量杀进程
批量杀进程的方法,先用ps命令列出进程的id及其他相关信息,如果列出进程依旧过多,可以使用grep命令进行过滤,然后通过awk拿到pid,再通过kill命令杀掉进程。
例如:下面的命令可以杀掉所有的python进程
ps aux|grep python |grep -v grep | awk '{ print $2 }' |xargs kill -9
查看topN进程
- 查看topN最占CPU的进程
使用ps的–sort命令按%CPU进行排序,再使用head命令就可以了.
例:查看最占CPU前10的进程
ps aux --sort -%cpu|head -n 10
- 查看topN最占内存的进程
ps -A -o pid,%mem,cmd --sort -%mem|head -n 10
- 查看topN虚拟内存使用最多的进程
ps -A -o pid,vsz,cmd --sort -vsz|head -n 10