进程

进程

程序的执行实例就是进程,系统为进程分配一个唯一的数字标识符,就是进程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命令支持三种不同风格的命令行参数:

  1. Unix风格的参数,前面加单破折线;例如 ps -ef
  2. BSD风格的参数,前面不加破折线;例如 ps axu
  3. 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进程

  1. 查看topN最占CPU的进程

使用ps的–sort命令按%CPU进行排序,再使用head命令就可以了.
例:查看最占CPU前10的进程

ps aux --sort -%cpu|head -n 10
  1. 查看topN最占内存的进程
ps -A -o pid,%mem,cmd --sort -%mem|head -n 10
  1. 查看topN虚拟内存使用最多的进程
ps -A -o pid,vsz,cmd --sort -vsz|head -n 10