Linux中的ps命令是Process Status的缩写。ps命令用于报告当前系统的进程状态,列出系统中当前运行的那些进程。可以搭配kill指令随时中断、删除不必要的程序。
要对进程进行监测和控制,首先必须要了解当前进程的情况,而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。
ps 为我们提供了进程的一次性的查看,也就是是当前那些进程的快照,它所提供的查看结果并不动态连续的;如果想对进程时间监控,应该用 top 工具。
kill 命令用于杀死进程。
linux上进程有5种状态:
1. 运行(正在运行或在运行队列中等待)
2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)
ps工具标识进程的5种状态码(S):
D 不可中断 uninterruptible sleep (usually IO)
R 运行 runnable (on run queue)
S 中断 sleeping
T 停止 traced or stopped
Z 僵死 a defunct (”zombie”) process
语法:
ps(选项)
选项说明:
-a:显示所有终端机下执行的程序,除了阶段作业领导者之外。
a:显示现行终端机下的所有程序,包括其他用户的程序。
-A:显示所有程序。
-c:显示CLS和PRI栏位。
c:列出程序时,显示每个程序真正的指令名称,而不包含路径,选项或常驻服务的标示。
-C<指令名称>:指定执行指令的名称,并列出该指令的程序的状况。
-d:显示所有程序,但不包括阶段作业领导者的程序。
-e:此选项的效果和指定"A"选项相同。
e:列出程序时,显示每个程序所使用的环境变量。
-f:显示UID,PPIP,C与STIME栏位。
f:用ASCII字符显示树状结构,表达程序间的相互关系。
-g<群组名称>:此选项的效果和指定"-G"选项相同,当亦能使用阶段作业领导者的名称来指定。
g:显示现行终端机下的所有程序,包括群组领导者的程序。
-G<群组识别码>:列出属于该群组的程序的状况,也可使用群组名称来指定。
h:不显示标题列。
-H:显示树状结构,表示程序间的相互关系。
-j或j:采用工作控制的格式显示程序状况。
-l或l:采用详细的格式来显示程序状况。
L:列出栏位的相关信息。
-m或m:显示所USER和WCHAN栏位。
-N:显示所有的程序,除了执行ps指令终端机下的程序之外。
-p<程序识别码>:指定程序识别码,并列出该程序的状况。
p<程序识别码>:此选项的效果和指定"-p"选项相同,只在列表格式方面稍有差异。
r:只列出现行终端机正在执行中的程序。
-s<阶段作业>:指定阶段作业的程序识别码,并列出隶属该阶段作业的程序的状况。
s:采用程序信号的格式显示程序状况。
S:列出程序时,包括已中断的子程序资料。
-t<终端机编号>:指定终端机编号,并列出属于该终端机的程序的状况。
t<终端机编号>:此选项的效果和指定"-t"选项相同,只在列表格式方面稍有差异。
-T:显示现行终端机下的所有程序。
-u<用户识别码>:此选项的效果和指定"-U"选项相同。
u:以用户为主的格式来显示程序状况。
-U<用户识别码>:列出属于该用户的程序的状况,也可使用用户名称来指定。
U<用户名称>:列出属于该用户的程序的状况。
v:采用虚拟内存的格式显示程序状况。
-V或V:显示版本信息。
-w或w:采用宽阔的格式来显示程序状况。
x:显示所有程序,不以终端机来区分。
X:采用旧式的Linux i386登陆格式显示程序状况。
-y:配合选项"-l"使用时,不显示F(flag)栏位,并以RSS栏位取代ADDR栏位 。
-<程序识别码>:此选项的效果和指定"p"选项相同。
--cols<每列字符数>:设置每列的最大字符数。
--columns<每列字符数>:此选项的效果和指定"--cols"选项相同。
--cumulative:此选项的效果和指定"S"选项相同。
--deselect:此选项的效果和指定"-N"选项相同。
--forest:此选项的效果和指定"f"选项相同。
--headers:重复显示标题列。
--help:在线帮助。
--info:显示排错信息。
--lines<显示列数>:设置显示画面的列数。
--no-headers:此选项的效果和指定"h"选项相同,只在列表格式方面稍有差异。
--group<群组名称>:此选项的效果和指定"-G"选项相同。
--Group<群组识别码>:此选项的效果和指定"-G"选项相同。
--pid<程序识别码>:此选项的效果和指定"-p"选项相同。
--rows<显示列数>:此选项的效果和指定"--lines"选项相同。
--sid<阶段作业>:此选项的效果和指定"-s"选项相同。
--tty<终端机编号>:此选项的效果和指定"-t"选项相同。
--user<用户名称>:此选项的效果和指定"-U"选项相同。
--User<用户识别码>:此选项的效果和指定"-U"选项相同。
--version:此选项的效果和指定"-V"选项相同。
--widty<每列字符数>:此选项的效果和指定"-cols"选项相同。
常用示例:
1、显示所有进程信息
命令:ps -A
[root@CTU1000094955 ~]# ps -A PID TTY TIME CMD 1 ? 00:20:52 systemd 2 ? 00:00:12 kthreadd 3 ? 00:00:00 ksoftirqd/0 5 ? 00:00:00 kworker/0:0H 7 ? 00:00:27 migration/0 8 ? 00:00:00 rcu_bh 9 ? 00:00:00 rcuob/0 ... ...#中间省略了部分 59785 ? 00:00:00 sshd 59795 pts/0 00:00:00 bash 60283 ? 00:00:00 kworker/1:2 60948 ? 00:00:00 kworker/2:2 62872 ? 00:00:00 kworker/0:1 64181 ? 00:00:01 setroubleshootd 64187 ? 00:00:00 sleep 64258 pts/0 00:00:00 ps 64259 ? 00:00:00 kworker/3:0 68591 ? 00:24:13 java 85204 ? 00:10:33 accounts-daemon 103598 ? 00:00:00 mysqld_safe 103762 ? 00:20:03 mysqld 120139 ? 00:00:14 kworker/u256:0 126191 ? 01:53:16 polkitd
2、显示指定用户信息
命令:ps -u root
[root@CTU1000094955 ~]# ps -u root PID TTY TIME CMD 1 ? 00:20:52 systemd 2 ? 00:00:12 kthreadd 3 ? 00:00:00 ksoftirqd/0 5 ? 00:00:00 kworker/0:0H 7 ? 00:00:27 migration/0 8 ? 00:00:00 rcu_bh 9 ? 00:00:00 rcuob/0 10 ? 00:00:00 rcuob/1 ... ... 中间省略了部分 59785 ? 00:00:00 sshd 59795 pts/0 00:00:00 bash 65450 ? 00:00:00 sleep 65521 pts/0 00:00:00 ps 68591 ? 00:24:15 java 85204 ? 00:10:33 accounts-daemon 103598 ? 00:00:00 mysqld_safe 120139 ? 00:00:14 kworker/u256:0
3、显示所有进程信息,连同命令行
命令:ps -ef
[root@CTU1000094955 ~]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 Oct04 ? 00:20:52 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 2 0 0 Oct04 ? 00:00:12 [kthreadd] root 3 2 0 Oct04 ? 00:00:00 [ksoftirqd/0] root 5 2 0 Oct04 ? 00:00:00 [kworker/0:0H] root 7 2 0 Oct04 ? 00:00:27 [migration/0] ... ... 中间省略了部分 root 59785 25566 0 10:52 ? 00:00:00 sshd: root@pts/0 root 59795 59785 0 10:52 pts/0 00:00:00 -bash root 65870 861 0 11:15 ? 00:00:00 sleep 60 root 65915 59795 0 11:16 pts/0 00:00:00 ps -ef root 68591 1 0 Nov16 ? 00:24:15 /biz/maas/cmdp/jre/bin/java -Djava.util.logging.config.file=/biz/maas/cmdp/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apa root 85204 1 0 Oct30 ? 00:10:33 /usr/libexec/accounts-daemon root 103598 1 0 Oct30 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/CTU1000094955.pid mysql 103762 103598 0 Oct30 ? 00:20:06 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/log/mariadb/maria root 120139 2 0 Nov11 ? 00:00:14 [kworker/u256:0] polkitd 126191 1 0 Oct10 ? 01:53:17 /usr/lib/polkit-1/polkitd --no-debug
4、ps 与grep 常用组合用法,查找特定进程
命令:ps -ef|grep ssh
[root@CTU1000094955 ~]# ps -ef|grep ssh root 25566 1 0 Oct31 ? 00:00:00 /usr/sbin/sshd -D root 59785 25566 0 10:52 ? 00:00:00 sshd: root@pts/0 root 66142 59795 0 11:18 pts/0 00:00:00 grep --color=auto ssh
5、将目前属于您自己这次登入的PID与相关信息列示出来
命令:ps -l
[root@CTU1000094955 ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 59795 59785 0 80 0 - 30751 wait pts/0 00:00:00 bash 0 R 0 66798 59795 0 80 0 - 34861 - pts/0 00:00:00 ps
说明:
F 代表这个程序的旗标 (flag):4 代表此进程的权限为root;为1表示此子进程仅可进行复制(fork),而无法实际执行(exec)。
S 代表这个程序的状态 (STAT),关于各 STAT 的含义已在上问题出。
UID 程序被该 UID 所拥有
PID 就是这个程序的 ID !
PPID 则是其上级父程序的ID
C CPU 使用的资源百分比
PRI/NI Priority /Nice的缩写,代表此进程被CPU所执行的优先级,数值越小代表该进程越快被CPU执行
ADDR 这个是 kernel function,指出该程序在内存的那个部分。如果是个 running的程序,一般就是 "-"
SZ 使用掉的内存大小
WCHAN 目前这个程序是否正在运作当中,若为 - 表示正在运作
TTY 登陆者的终端机位置,若为远程登录则使用动态终端口(pts/n)
TIME 使用掉的 CPU 时间。是此进程实际花费CPU运行的时间,而不是系统时间。
CMD Command的缩写,造成此程序的触发进程的命令为何种命令
为何在预设的情况下, ps 仅会列出与目前所在的 bash shell 有关的 PID 而已,所以, 当我使用 ps -l 的时候,只有2个 PID。
6、列出目前所有的正在内存当中的程序
命令:ps aux
[root@CTU1000094955 ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 201588 13760 ? Ss Oct04 20:53 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 2 0.0 0.0 0 0 ? S Oct04 0:12 [kthreadd] root 3 0.0 0.0 0 0 ? S Oct04 0:00 [ksoftirqd/0] ... ...中间省略了部分内容 root 68591 0.2 12.5 5609960 936952 ? Sl Nov16 24:18 /biz/maas/cmdp/jre/bin/java -Djava.util.logging.config.file=/biz/maas/cmdp/tomcat/conf/logging.properties -Djava.util.logging root 70812 0.0 0.0 116272 708 ? S 11:34 0:00 sleep 60 root 70892 0.0 0.0 141564 1692 pts/0 R+ 11:35 0:00 ps aux root 85204 0.0 0.0 384676 3780 ? Ssl Oct30 10:33 /usr/libexec/accounts-daemon root 103598 0.0 0.0 18084 1732 ? S Oct30 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/CTU1000094955.pid mysql 103762 0.0 6.4 2293168 478984 ? Sl Oct30 20:06 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/l root 120139 0.0 0.0 0 0 ? S Nov11 0:14 [kworker/u256:0] polkitd 126191 0.1 6.3 990528 473472 ? Ssl Oct10 113:22 /usr/lib/polkit-1/polkitd --no-debug
说明(与ps -l并不相同):
USER:该 process 属于那个使用者账号的
PID :该 process 的号码
%CPU:该 process 使用掉的 CPU 资源百分比
%MEM:该 process 所占用的物理内存百分比
VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
RSS :该 process 占用的固定的内存量 (Kbytes)
TTY :该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
STAT:该程序目前的状态,主要的状态有
R :该程序目前正在运作,或者是可被运作
S :该程序目前正在睡眠当中 (可说是 idle 状态),但可被某些讯号 (signal) 唤醒。
T :该程序目前正在侦测或者是停止了
Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
START:该 process 被触发启动的时间
TIME :该 process 实际使用 CPU 运作的时间
COMMAND:该程序的实际指令
7、列出类似程序树的程序显示
命令:ps -axjf
[root@CTU1000094955 ~]# ps -axjf PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND 0 2 0 0 ? -1 S 0 0:12 [kthreadd] 2 3 0 0 ? -1 S 0 0:00 \_ [ksoftirqd/0] 2 5 0 0 ? -1 S< 0 0:00 \_ [kworker/0:0H] 2 7 0 0 ? -1 S 0 0:27 \_ [migration/0] ... ...中间省略了部分内容 1 126191 126191 126191 ? -1 Ssl 997 113:23 /usr/lib/polkit-1/polkitd --no-debug 126191 20349 126191 126191 ? -1 Z 997 0:00 \_ [pkla-check-auth] <defunct>1 85204 85204 85204 ? -1 Ssl 0 10:33 /usr/libexec/accounts-daemon 1 103598 103580 85217 ? -1 S 0 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --pid-file=/var/lib/mysql/CTU1000094955.pid 103598 103762 103580 85217 ? -1 Sl 27 20:06 \_ /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/var/l 1 25566 25566 25566 ? -1 Ss 0 0:00 /usr/sbin/sshd -D 25566 59785 59785 59785 ? -1 Ss 0 0:00 \_ sshd: root@pts/0 59785 59795 59795 59795 pts/0 71869 Ss 0 0:00 \_ -bash 59795 71869 71869 59795 pts/0 71869 R+ 0 0:00 \_ ps -axjf 1 68591 68583 16869 ? -1 Sl 0 24:19 /biz/maas/cmdp/jre/bin/java -Djava.util.logging.config.file=/biz/maas/cmdp/tomcat/conf/logging.properties -Djava.util.logging.man 1 71817 829 829 ? -1 Sl 991 0:01 /usr/bin/python -Es /usr/sbin/setroubleshootd -f
8、找出与 cron 与 syslog 这两个服务有关的 PID 号码
命令:ps aux | egrep '(cron|syslog)'
[root@CTU1000094955 ~]# ps aux | egrep '(cron|syslog)' root 856 0.0 0.2 506844 16808 ? Ssl Oct04 57:17 /usr/sbin/rsyslogd -n root 1768 0.0 0.0 130480 1528 ? Ss Oct04 1:20 /usr/sbin/crond -n gnome-i+ 5961 0.0 0.0 477312 3576 ? S<l Oct04 0:13 /usr/bin/pulseaudio --start --log-target=syslog root 72278 0.0 0.0 118872 1040 pts/0 S+ 11:45 0:00 grep -E --color=auto (cron|syslog)
9、可以用 | 管道和 more 连接起来分页查看
命令:ps -aux |more
[root@CTU1000094955 ~]# ps -aux |more USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 201588 13760 ? Ss Oct04 20:53 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 2 0.0 0.0 0 0 ? S Oct04 0:12 [kthreadd] ... ... 中间省略了部分 root 35 0.0 0.0 0 0 ? S Oct04 0:00 [rcuob/26] root 36 0.0 0.0 0 0 ? S Oct04 0:00 [rcuob/27] root 37 0.0 0.0 0 0 ? S Oct04 0:00 [rcuob/28] --More--
10、把所有进程显示出来,并输出到ps001.txt文件
命令:ps -aux > 目的文件
[root@CTU1000094955 ~]# ps -aux > pstest.txt [root@CTU1000094955 ~]# ll total 76 -rw-------. 1 root root 1664 Jan 16 2017 anaconda-ks.cfg drwxr-xr-x. 2 root root 4096 Jan 16 2017 Desktop drwxr-xr-x. 2 root root 4096 Jan 16 2017 Documents drwxr-xr-x. 5 root root 4096 Nov 1 18:16 Downloads -rw-------. 1 root root 1712 Jan 16 2017 initial-setup-ks.cfg drwxr-xr-x. 2 root root 4096 Jan 16 2017 Music drwxr-xr-x. 2 root root 4096 Jan 16 2017 Pictures -rw-r--r--. 1 root root 36460 Nov 23 11:50 pstest.txt
11、输出指定的字段
命令:ps -o pid,ppid,pgrp,session,tpgid,comm
[root@CTU1000094955 ~]# ps -o pid,ppid,pgrp,session,tpgid,comm PID PPID PGRP SESS TPGID COMMAND 59795 59785 59795 59795 73308 bash 73308 59795 73308 59795 73308 ps