ps 命令是 process status 的简写,主要用于查询当前正在运行中进程的信息,它从 /proc/进程ID
目录中读取指定进程ID的信息mysql
ps [options]
ps 的选项很是多,总共有一百多个选项,能够经过 ps L | wc -l
命令查看ps的选项数量sql
这篇文章主要介绍 ps 命令的一些经常使用的用法,对于一些使用频率很低的选项不在这里讨论centos
根据选项前是否有 -
,ps命令的选项能够分红如下几种风格bash
-
开头-
开头--
开头[root@ecs-centos-7 ~]# ps p 842 PID TTY STAT TIME COMMAND 842 ? Sl 12:55 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid [root@ecs-centos-7 ~]# ps -p 842 PID TTY TIME CMD 842 ? 00:12:55 mysqld [root@ecs-centos-7 ~]# ps --pid 842 PID TTY TIME CMD 842 ? 00:12:55 mysqld
上面的例子中 ps p 842
和 ps -p 842
以及 ps --pid 842
都是查询进程ID为842的进程信息,只不过度别用ps命令选项的 BSD风格、UNIX风格、GNU风格而已服务器
注意:ps命令选项能够混用不一样风格的选项,可是可能会出现冲突,兼容混用的主要缘由是帮助过分旧的脚本和习惯,咱们实际使用的时候尽可能使用同一种风格的选项ui
经过 ps -A
或者 ps -e
命令能够查看全部运行中的进程线程
[tt@ecs-centos-7 ~]$ ps -fA | more UID PID PPID C STIME TTY TIME CMD root 1 0 0 Aug14 ? 00:00:07 /usr/lib/systemd/systemd --switched-root --system --deserialize 22 root 2 0 0 Aug14 ? 00:00:00 [kthreadd] root 4 2 0 Aug14 ? 00:00:00 [kworker/0:0H] [tt@ecs-centos-7 ~]$ ps -fe | more UID PID PPID C STIME TTY TIME CMD root 1 0 0 Aug14 ? 00:00:07 /usr/lib/systemd/systemd --switched-root --system --deserialize 22 root 2 0 0 Aug14 ? 00:00:00 [kthreadd] root 4 2 0 Aug14 ? 00:00:00 [kworker/0:0H]
列说明:code
UID: 进程所属的用户 PID: 进程ID PPID: 进程的父进程ID C: 同 %CPU,进程CPU利用率 STIME: 进程启动的日期 TTY: 进程相关的终端 TIME: 进程占用的总CPU时间 CMD: 进程启动命令以及参数
-f
或 -F
选项:全格式列表选项,这个选项和其余UNIX风格的选项组合使用能够使得结果多出一些列blog
上面例子中 -A
和 -e
选项都是查看全部运行的进程信息的,后面重定向到 more
命令是为了分页查看结果进程
-u、-U、U、--user、--User
这几个选项后面接用户名列表(用户名之间用逗号分隔) 或用户ID列表(ID之间用逗号分隔) , 能够查看指定用户列表中用户的进程
[root@ecs-centos-7 ~]# ps -u tt PID TTY TIME CMD 13087 pts/8 00:00:00 bash 13257 pts/9 00:00:00 bash [root@ecs-centos-7 ~]# ps -u wl PID TTY TIME CMD 13275 pts/11 00:00:00 bash 13294 pts/11 00:00:00 top [root@ecs-centos-7 ~]# ps -u tt,wl PID TTY TIME CMD 13087 pts/8 00:00:00 bash 13257 pts/9 00:00:00 bash 13275 pts/11 00:00:00 bash 13294 pts/11 00:00:00 top
上面例子中分别查看了用户 tt
和 wl
的进程,用户列表tt,wl
的进程其实是列表中每一个用户的进程组合
[root@ecs-centos-7 ~]# id tt uid=1003(tt) gid=1003(tt) groups=1003(tt) [root@ecs-centos-7 ~]# id wl uid=1000(wl) gid=1000(wl) groups=1000(wl) [root@ecs-centos-7 ~]# ps -u 1003 PID TTY TIME CMD 13087 pts/8 00:00:00 bash 13257 pts/9 00:00:00 bash [root@ecs-centos-7 ~]# ps -u 1000 PID TTY TIME CMD 13275 pts/11 00:00:00 bash 13294 pts/11 00:00:00 top [root@ecs-centos-7 ~]# ps -u 1003,1000 PID TTY TIME CMD 13087 pts/8 00:00:00 bash 13257 pts/9 00:00:00 bash 13275 pts/11 00:00:00 bash 13294 pts/11 00:00:00 top
上面例子中分别按照用户tt
和wl
的用户ID 查看进程, 用户ID列表1003,1000
的进程其实是列表中每一个用户ID的进程组合
ps p 进程ID
、ps -p 进程ID
、ps --pid 进程ID
这三种方式均可以查看指定进程ID的进程信息
[root@ecs-centos-7 ~]# ps -p 1,2,4 PID TTY TIME CMD 1 ? 00:00:07 systemd 2 ? 00:00:00 kthreadd 4 ? 00:00:00 kworker/0:0H
上面例子中查看进程ID分别为 1,2,4
的进程信息,使用 ps p 1,2,4
命令或者 ps --pid 1,2,4
命令也能够获得和例子中同样的结果
知道了进程ID,能够经过 ps -fL -p 进程ID
命令查看指定进程的线程信息
[root@ecs-centos-7 ~]# ps -fL -p 842 UID PID PPID LWP C NLWP STIME TTY TIME CMD mysql 842 1 842 0 27 Aug14 ? 00:00:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid mysql 842 1 1043 0 27 Aug14 ? 00:00:00 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid mysql 842 1 1061 0 27 Aug14 ? 00:00:37 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
线程相关字段说明:
LWP: 线程ID NLWP: 线程数量
上面的例子查看进程ID为842的进程(MySQL进程)的线程信息,因为输出信息太多,这里只截取了一部分,从结果能够看出,MySQL进程有27个线程,其中 PID
和 LWP
值相同的是主线程
在服务器开发中,关闭服务器进程的时候,一般都须要根据进程名字取得进程ID,而后再利用 kill 命令向指定进程ID发送终止信号
[root@ecs-centos-7 ~]# ps aux | grep mysql | grep -v grep | awk '{print $2}' 842
上面的例子中,ps aux
是查找全部用户运行的进程,grep mysql
是从前面查找的结果中过滤出含有mysql
的关键字,grep -v grep
是从上一步的结果中进一步去掉含有 grep
的关键字,最后 awk '{print $2}
是输出最终结果中第二列的值,也即MySQL的进程ID
注意:ps命令查找的结果中程序启动命令以及参数(CMD列)最多只能显示15个字符宽度,若是应用程序名字查过15字符长度,就会被截断,此时用 grep 查找应用程序名字的话会出现找不到应用程序的状况。关于这个问题请参考 ps 命令显示不完整的问题
在对 Linux 系统中问题进行故障排除的过程当中,ps命令是经常使用的命令之一,它有不少的选项,可是大多数时候都在使用 ps aux
或者 ps -ef
命令查看正在运行进程的信息
有关 ps 命令更多选项能够经过 man ps
命令查看