Linux命令(二): ps,kill 进程相关命令详解

ps 命令是 Process Status 的缩写,报告当前进程的快照。用于查看进程状态,可以查看哪些进程正在运行及所占资源情况等等。

kill 用于终止运行中的进程,可以通过指定进程号(pid)来杀死指定的进程。

ps

Linux ps (英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器。

ps 显示有关选中的活动进程的信息。如果要重复更新(动态显示)所选内容和显示的信息,请改用 top 命令。

语法

1
ps [options]

ps 命令的 参数选项(options)接受下面三种语法风格:

  • UNIX:可以组合在一起使用,前面必须有 -符号。

  • BSD:可以组合在一起使用,前面不能与 - 一起使用

  • GND:长选项,前面有两个--符号

参数

ps 的参数非常多,下面仅列出几个常用的参数及大致含义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-A 显示所有进程(同 -e)
a 显示所有进程
-a 显示同一终端下的所有进程
-u 显示进程的用户信息
-f 完整列表显示进程信息
-l
c 显示进程的真实名称
-N 反向选择
e 显示环境变量
-H 显示树状结构
r 显示当前终端的进程
T 显示当前终端的所有程序
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的行程
-C<命令> 列出指定命令的状况
--lines<行数> 每页显示的行数
--width<字符数> 每页显示的字符数
--help 显示帮助信息
--version 显示版本显示

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 要使用标准语法查看系统上的每个进程:
ps -e
ps -ef
ps -eF
ps -ely

# 要使用BSD语法查看系统上的每个进程,请执行以下操作:
ps ax
ps axu

# 树型结构显示进程树,包括进程的线程
ps -ejH
ps axjf # 也可使用 pstree 命令
# 要获取有关线程的信息
ps -eLf
ps axms

# 获取安全信息
ps -eo euser,ruser,suser,fuser,f,comm,label
ps axZ
ps -eM

# -e 显示所有进程信息, -o 参数控制输出; Pid,User,Args参数分别显示PID,用户,应用
# 能与 -e 参数一起使用的关键字有 args,cmd,comm,command,fname,ucmd,ucomm,lstart,bsdstart 和 start
ps -eo pid,user,args

# 要以用户格式查看以root(实际有效ID)身份运行的每个进程:
# -U 参数按真实用户ID(RUID)筛选进程,它会从用户列表中选择真实用户名或 ID。真实用户即实际创建该进程的用户
# -u 参数用来筛选有效用户ID(EUID)
# 最后的 u 参数用来指定以用户的格式输出,由User,PID,%CPU,%MEM,VSZ,RSS,TTY,STAT,START,TIME和COMMAND这几列
ps -U root -u root u

# 要使用用户定义的格式查看每个进程,请执行以下操作
ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ps -Ao pid,tt,user,fname,tmout,f,wchan

# 只打印syslogd的进程ID:
ps -C syslogd -o pid=

# 只打印PID 42的名称:
ps -q 42 -o comm=

帮助

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
[root@iZf8z5ura2kb73ra6wu0phZ ~]# ps --help

Usage:
ps [options]

Try 'ps --help <simple|list|output|threads|misc|all>' #[简单|列表|输出|线程|其它|所有]
or 'ps --help <s|l|o|t|m|a>'
for additional help text.
[root@iZf8z5ura2kb73ra6wu0phZ ~]# ps --help a

Usage:
ps [options]

Basic options: # 基本的参数选项
-A, -e # 所有进程
-a all with tty, except session leaders
a all with tty, including other users
-d all except session leaders
-N, --deselect negate selection
r # 正在运行的进程
T # 在此终端的所有进程
x # 没有终端控制的进程

Selection by list: # 按列表选择
-C <command> # 命令名称,进程命称
-G, --Group <GID> real group id or name
-g, --group <group> session or effective group name
-p, p, --pid <PID> process id
--ppid <PID> parent process id
-q, q, --quick-pid <PID>
process id (quick mode)
-s, --sid <session> session id
-t, t, --tty <tty> terminal
-u, U, --user <UID> effective user id or name
-U, --User <UID> real user id or name

The selection options take as their argument either:
a comma-separated list e.g. '-u root,nobody' or
a blank-separated list e.g. '-p 123 4567'

Output formats: # 选择输出格式
-F extra full
-f #完整格式,包括命令行
f, --forest ascii art process tree
-H show process hierarchy
-j jobs format
j # BSD 工作的控制格式
-l # 长格式输出,较详细的信息
l BSD long format
-M, Z add security data (for SELinux)
-O <format> preloaded with default columns
O <format> as -O, with BSD personality
-o, o, --format <format>
user-defined format
s signal format
u user-oriented format
v virtual memory format
X # 寄存器格式
-y do not show flags, show rss vs. addr (used with -l)
--context display security context (for SELinux)
--headers repeat header lines, one per page
--no-headers do not print header at all
--cols, --columns, --width <num>
set screen width
--rows, --lines <num>
set screen height

Show threads:
H as if they were processes
-L possibly with LWP and NLWP columns
-m, m after processes
-T possibly with SPID column

Miscellaneous options: # 其它选项
-c show scheduling class with -l option
c show true command name
e show the environment after command
k, --sort specify sort order as: [+|-]key[,[+|-]key[,...]]
L show format specifiers
n display numeric uid and wchan
S, --cumulative include some dead child process data
-y do not show flags, show rss (only with -l)
-V, V, --version display version information and exit
-w, w unlimited output width

--help <simple|list|output|threads|misc|all>
display help and exit

[root@iZf8z5ura2kb73ra6wu0phZ ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.5 241740 9956 ? Ss Oct07 0:10 /usr/lib/systemd/systemd --switched-root --system --deserialize 17
root 2 0.0 0.0 0 0 ? S Oct07 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< Oct07 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< Oct07 0:00 [rcu_par_gp]
root 6 0.0 0.0 0 0 ? I< Oct07 0:00 [kworker/0:0H-kblockd]

USER PID PPID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
所属用户 进程ID 父进程ID CPU使用率 内存使用率 使用的虚拟内存 占用的固定内存 终端号,或终端位置 进程状态 开始时间 执行时间,占用的CPU处理时间 所执行命令
1
2
3
4
# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 18614 18613 0 80 0 - 6636 - pts/1 00:00:00 bash
0 R 0 19743 18614 0 80 0 - 11191 - pts/1 00:00:00 ps
F S UID C PRI NI ADD SZ WCHAN CMD
代表这个程序的旗标 (flag),
4 代表使用者为 superuser
代表这个程序的状态 (STAT); 用户ID 占用CPU资源比率 进程优先级,Priority 的简写 进程的优先级值,nice值,表示进程可被执行的优先级的修正数值 内核函数,进程所在内存的位置,发果是执行程序,一般是 [ - ] 使用掉的内存大小 进程是否正在运行,若为 - 表示正在运作 同 COMMAND,正在执行的命令

TTY:该进程是在那个终端机上面运作,若与终端机无关,则显示 ?。另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。

STAT:进程当前的状态,主要有:

  • R :Running,正在运作,或者是可被运作
  • S :Sleeping,正在休眠中,但可被某些讯号(signal) 唤醒
  • T :Termination,停止或被跟踪
  • D:不可中断 uninterruptible sleep (usually IO)
  • Z :Zombie,该程序应该已僵死,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
  • s:包含子进程
  • X:死掉的进程
  • <:高优先级
  • N:低优先级
  • L:有些页被锁进内存
  • +:位于后台的进程组
  • l:多线程,克隆线程

ps结合grep查找指定进程

1
ps -ef|grep java

ps给合watch监控进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 监控所有进程信息,按内存和CPU使用排序
# -n 1 指监控间隔 1 秒输出
watch -n 1 'ps -aux --sort -pmem,-pcpu'

# 显示前10条信息
watch -n 1 'ps -aux --sort -pmem,-pcpu | head -n 10'

# 输出结果
Every 10.0s: ps -aux --sort -pmem,-pcpu | head -n 10 iZf8z5ura2kb73ra6wu0phZ: Wed Oct 28 11:37:57 2020

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 19611 0.1 20.4 2905268 361308 ? Sl Oct26 2:32 java -jar blog-web-2.2.2.jar
root 19612 0.0 18.3 2912164 325028 ? Sl Oct26 1:25 java -jar blog-admin-2.2.2.jar
mysql 9841 0.0 17.7 1642560 313516 ? Sl Oct09 9:35 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/u
root 875 0.0 1.2 424308 22748 ? Ssl Oct07 2:04 /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P
root 11394 0.2 1.2 174764 21688 ? S<sl Oct23 16:34 /usr/local/aegis/aegis_client/aegis_10_89/AliYunDun
polkitd 704 0.0 0.7 1626820 13624 ? Ssl Oct07 0:00 /usr/lib/polkit-1/polkitd --no-debug
root 541 0.0 0.7 155932 13544 ? Ss Oct07 0:05 /usr/lib/systemd/systemd-journald
root 870 0.0 0.6 389076 11264 ? Ssl Oct07 0:13 /usr/sbin/NetworkManager --no-daemon
root 786 0.0 0.5 220688 9992 ? S Oct07 0:12 /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --logger=files

显示所有进程及命令行

1
2
# -e 等于 -A; -f 显示完整格式,包括命令行
ps -ef

显示所有在内存中的进程

1
ps aux

根据CPU使用来升序排序

1
ps -aux --sort -pcpu | less

根据内存使用来排序

1
ps -aux --sort -pmem | less

条件显示前10个结果

1
ps -aux --sort -pcpu,+pmem | head -n 10

指定进程名,命令名

1
ps -C java

指定进程ID显示信息

1
ps -p 19914

查看指定进程的线程

1
ps -L 19914

显进程的树型结构

1
ps -axjf

显示进程及其线程树结构

1
pstree -p root | grep java

root 为用户名,-p 为显示进程ID。

显示进程开启的线程

1
ps -Lf 19611

显示进程的栈跟踪信息

1
2
3
4
# 安装GDB调试工具
yum install gdb

pstack 19611

显示所有进程信息

1
ps -A

显示指定用户的进程

1
ps -u root

输出指定的字段

1
2
3
4
5
ps -o pid,ppid,pgrp,session,tpgid,comm
ps -eo %cpu,%mem,vsz,rsz,start,stat,pid,sid,ni,uid,user,rss,time,command
# 指定进程号
ps -o %cpu,%mem,vsz,rsz,start,stat,pid,sid,ni,uid,user,rss,time,command --pid 19611
%CPU %MEM VSZ RSZ STARTED STAT PID SID NI UID USER RSS TIME COMMAND

进程信息输出到文件

1
ps -aux > ps_aux.txt

分页查看输出的信息

1
2
3
# 用 | 管道和 more 或 less 连接起来分页查看
ps -aux |more
ps -ax|less

显示指定服务相关的进程

1
ps aux | egrep '(cron|syslog)'

kill

kill 命令是向指定的进程或进程组发送指定的信号。

语法

1
2
kill [-signal|-s signal|-p] [-q value] [-a] [--] pid|name...
kill -l [number] | -L

描述

如果未指定信号,则发送TERM(15号)信号。 此信号的默认操作是终止进程。该信号应优先于KILL信号(9号)使用,因为一个进程可能会为TERM信号安装一个处理程序,以便在有序终止之前执行清理步骤。

如果在发送TERM信号后进程没有终止,则可以使用KILL信号。请注意,后者的信号是无法被目标进程捕获的,因此不会给目标进程提供在终止之前执行任何清理的机会。

大多数现代 Shell 内置了kill命令,其用法与此处描述的命令非常相似。--all,-pid--queue选项以及通过命令名称指定进程的可能性都是本地扩展。

如果信号为 0,则不发送实际信号,但仍执行错误检查。

参数

1
2
3
4
5
# 列出所有信号名称和编号, 或把给定的信号编码转换为名称
-l --list [number]

# 与 -l 类似, 打印信号名称及对应的编号
-L --table

最常用的信息有:

  • 1:HUP,重新加载进程
  • 9:KILL,直接杀死一个进程
  • 15:TERM,默认编码,正常停止一个进程,在停止前会执行一些回收工作,某些情况下可能杀不死

信号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@iZf8z5ura2kb73ra6wu0phZ blog]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
[root@iZf8z5ura2kb73ra6wu0phZ blog]# kill -l 15
TERM
[root@iZf8z5ura2kb73ra6wu0phZ blog]# kill -l 9
KILL

返回

kill 命令有以下返回值:

  • 0:成功
  • 1:失败
  • 64:部分成功(当指定一不只一个进程时)

正常终止指定进程

kill [pid]:根据PID杀死进程。

1
2
# 等同于 kill -15 4786,终止进程,可能存在终止失败的情况,就可使用 9 号信息强止终止。
kill 4786

强制杀死指定进程

1
2
# 强制杀死进程
kill -9 4786

PS命令查看进程号

执行kill命令之前,常会查看执行程序的进程号PID

1
2
3
4
# 查看进程信息,有显示PID列即为进程号
ps -ef|grep nginx

root 4786 1 0 Mar18 ? 00:00:00 nginx: master process ./nginx

杀死指定用户所有进程

1
2
3
4
# 方法一 过滤出进程 
kill -9 $(ps -ef | grep java)
# 方法二 指定用户进程名
kill -u java

其它参考命令

ps(1), regex(7), signal(7), killall(1), skill(1), kill(1), kill(2)

pgrep,pkill

pgrep,pkill:基于名称和其他属性查找或通知进程

语法

1
2
pgrep [options] pattern
pkill [options] pattern

pattern:指定扩展正则表达式以与进程名或命令行匹配。

pgrep

pgrep查看当前正在运行的进程,并列出与选择标准匹配到 stdout 的进程ID。 所有条件都必须匹配。 例如,

1
2
3
4
5
# 列出 root 用户拥有的 sshd 进程号
$ pgrep -u root sshd

# 列出 root 用户和daemon用户的所有进程号
$ pgrep -u root,daemon

pkill

pkil将向每个进程发送指定的信号(默认为SIGTERM),而不是在stdout上列出它们。

示例

1
2
3
4
5
6
7
8
9
10
11
12
Example 1: Find the process ID of the named daemon:
$ pgrep -u root named

Example 2: Make syslog reread its configuration file:
$ pkill -HUP syslogd

Example 3: Give detailed information on all xterm processes:
$ ps -fp $(pgrep -d, -x xterm)

Example 4: Make all chrome processes run nicer:
$ renice +4 $(pgrep chrome)

Linux命令(二): ps,kill 进程相关命令详解

http://blog.gxitsky.com/2018/05/10/Linux-Command-2-ps-kill/

作者

光星

发布于

2018-05-10

更新于

2022-06-17

许可协议

评论