1. ps 查看进程
1.1 ps
语法格式:ps 选项
功能描述:查看系统中所有与运行进程的详细信息
选项参数:
选项 | 描述 |
---|---|
a | 显示一个终端的所有进程,除去会话引线 |
u | 显示进程的归属者及内存的使用情况 |
x | 显示没有控制终端的进程 |
-l | 长格式显示更加详细的信息 |
-e | 显示所有进程 |
常用组合:
ps aux
:查看系统中所有的进程,使用 BS 操作系统格式ps -le
:查看系统中所有的进程,使用 Linux 标准命令格式,显示如父进程、PID、进程优先级等
案例演示:
[root@joel ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 125320 3876 ? Ss Nov06 0:49 /usr/lib/systemd/system
root 2 0.0 0.0 0 0 ? S Nov06 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< Nov06 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S Nov06 0:01 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S Nov06 0:00 [migration/0]
...
USER:进程所属者
PID:进程的ID
%CPU:该进程占用CPU资源的百分比,一个核心是100%,四个核心是400%
%MEM:该进程占用物理内存的百分比
VSZ:该进程占用虚拟内存的大小
RSS:该进程占用实际物理内存的大小
TTY:该进程是在哪个终端运行的
- tty1~tty6 是本地的字符界面终端
- tty7 是图形终端
- pts/0 ~ 255 代表虚拟终端
STAT:进程状态
- -D:不可被唤醒的睡眠状态,通常用于 I/O 情况
- -R:该进程正在运行
- -S:该进程处于睡眠状态,可被唤醒
- -T:停止状态,可能是在后台暂停或进程处于除错状态
- -W:内存交互状态(从 2.6 内核开始无效)
- -X:死掉的进程(应该不会出现)
- -Z:僵尸进程。进程已经中止,但是部分程序还在内存当中
- -<:高优先级(以下状态在 BSD 格式中出现)
- -N:低优先级
- -L:被锁入内存
- -s:包含子进程
- -l:多线程(小写 L
- -+:位于后台
START:该进程的启动时间
TIME:该进程占用CPU的运算时间
COMMAND:产生此进程的命令名
[root@joel ~]# ps -el
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 31330 ep_pol ? 00:00:49 systemd
1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd
1 S 0 4 2 0 60 -20 - 0 worker ? 00:00:00 kworker/0:0H
1 S 0 6 2 0 80 0 - 0 smpboo ? 00:00:01 ksoftirqd/0
1 S 0 7 2 0 -40 - - 0 smpboo ? 00:00:00 migration/0
...
F:进程标志,说明进程的权限
- 1:进程可以被复制,但是不能被执行
- 4:进程使用超级用户权限
S:进程状态,与
ps aux
中的STAT状态一致UID:运行该进程的用户ID
PID:该进程的ID
PPID:父进程的ID
C:该进程的CPU占用率
PRI:进程的优先级,数值越小优先级越高,越早被CPU执行
NI:进程的优先级,数值越小,越早被执行
ADDR:该进程在内存的哪个位置
SZ:该进程占用的内存
WCHAN:该进程是否运行,
-
表示正在运行TTY:该进程由哪个终端产生
TIME:该进程占用CPU的运算时间
CMD:产生此进程的命令名
1.2 pstree
可是使用 pstree
以树形结构显示程序和进程之间的关系
语法格式:pstree [选项] PID或用户名
选项参数:
- -c:显示启动每个进程对应的完整命令,包括启动进程的路径、参数等
- -c:不使用精简法显示进程信息,即显示的进程中包含子进程和父进程
- -n:根据进程 PID 号排序,默认为程序名牌排序
- -p:显示进程的 PID
- -u:显示进程的所属者
2. 查找具体的PID
在实际应用中,如果只知道PID,而不知道PID对应的程序,我们还是无法直接杀S进程,这时就需要用到一套组合命令:
ps -ef | grep test | grep -v grep | awk '{print $2}' | xargs kill -9
下面写一个死循环,并杀S该进程
2.1 循环
1️⃣ Step1:使用 vim
新建文件 Ptest.sh
[root@joel ~]# vim Ptest.sh
2️⃣ Step2:进去新的页面,按键盘字母 i
进入插入模式,写入死循环
#!/bin/bash
while true
do
echo 别想干掉我!
done
3️⃣ Step3:书写完后,按键盘的 ESC
退出插入模式,输入 :wq
保存并退出
4️⃣ Step4:运行此脚本
[root@joel ~]# bash Ptest.sh
死循环开始了...
2.2 查找该进程
1️⃣ Step1:打开一个新的终端,利用 ps -ef
命令查找该进程
[root@joel ~]# ps -ef
root 30131 26888 18 09:45 pts/0 00:00:38 bash Ptest.sh
root 30273 1043 0 09:48 ? 00:00:00 sshd: root@pts/1
root 30276 30273 0 09:48 pts/1 00:00:00 -bash
root 30320 30276 0 09:49 pts/1 00:00:00 ps -ef
...
2️⃣ Step2:上面的命令列出来所有的进程,我们通过管道符 |
进行下一步查找,该符号将左边的输出作为右边的输入
3️⃣ Step3:通过 grep Ptest
根据名称查找具体的进程
[root@joel ~]# ps -ef | grep Ptest
root 30131 26888 18 09:45 pts/0 00:01:30 bash Ptest.sh
root 30551 30276 0 09:53 pts/1 00:00:00 grep --color=auto Ptest
4️⃣ Step4:上面的命令输出了两行,而我们只需要第一条,需要使用 grep -v grep
将第二条过滤掉
[root@joel ~]# ps -ef | grep Ptest | grep -v grep
root 30131 26888 18 09:45 pts/0 00:01:50 bash Ptest.sh
5️⃣ Step5:找到了具体的详细信息,确保是我们需要杀S的进程,通过 awk '{print $2}'
将字符串以空格分隔,并取到第二个
[root@joel ~]# ps -ef | grep Ptest | grep -v grep | awk '{print $2}'
30131
2.3 杀死S进程
找到进程后我们需要将该进程死S,通常使用 kill -9 PID
,但是我们发现如果在直接将该命令直接放到查找PID之前是由问题的,我们是先找到PID再死S,所以需要使用 xargs
命令,将左侧的结果当作右侧的参数。
完整的命令如下:
ps -ef | grep Ptest | grep -v grep | awk '{print $2}' | xargs kill -9
别想干掉我!
别想干掉我!
别想干掉我!
别想干掉我!Killed
3. 写在最后
|
:管道符,将左边的输出作为右边的输入
awk
/ sed
:是CentOS中非常流行的文本处理工具
xargs
:将左侧命令的结果当作右侧命令的参数