Linux 进程管理
Windows
有任务管理器来管理进程,Linux
也有相应的命令来管理进程。
查看进程
ps
- 查看静态的进程统计信息
a
:显示当前终端下的所有进程信息,包括其他用户的进程。与x
选项结合时将显示系统中所有的进程信息。
u
:使用以用户为主的格式输出进程信息。
x
:显示当前用户在所有终端下的进程信息。
-e
:显示系统内的所有进程信息。
-l
:使用长(Long)格式显示进程信息。
-f
:使用完整的(Full)格式显示进程信息。
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 128164 6832 ? Ss 15:50 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0.0 0.0 0 0 ? S 15:50 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 15:50 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 15:50 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 15:50 0:00 [kworker/u256:0]
root 7 0.0 0.0 0 0 ? S 15:50 0:00 [migration/0]
//有很多,不写。
USER
:启动该进程的用户账号的名称。
PID
:该进程在系统中的数字ID
号,在当前系统中是唯一的。
%CPU
:CPU
占用的百分比。
%MEM
:内存占用的百分比。
VSZ
:占用虚拟内存(swap
空间)的大小。
RSS
:占用常驻内存(物理内存)的大小。
TTY
:表明该进程在哪个终端上运行。?
表示未知或不需要终端。
STAT
:显示进程当前的状态,如S可中断休眠进程
、D不可中断休眠进程
、R运行
、Z僵死
、<高优先级
、N低优先级
、s父进程
、l多线性进程
、+前台进程
。对处于僵死状态的进程应该予以手动终止。
START
:启动该进程的时间。
TIME
:该进程占用的CPU
时间。
COMMAND
:启动该进程的命令的名称。
[root@localhost ~]# ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 32041 ep_pol 15:50 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
1 S root 2 0 0 80 0 - 0 kthrea 15:50 ? 00:00:00 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo 15:50 ? 00:00:00 [ksoftirqd/0]
1 S root 5 2 0 60 -20 - 0 worker 15:50 ? 00:00:00 [kworker/0:0H]
1 S root 6 2 0 80 0 - 0 worker 15:50 ? 00:00:00 [kworker/u256:0]
1 S root 7 2 0 -40 - - 0 smpboo 15:50 ? 00:00:00 [migration/0]
//有很多,不写。
PPID
:当前进程的父进程
C
:CPU
占用
PRI
:用户态的进程优先级
NI
:内核态的进程优先级,取值范围-20~19
,数值越低,优先级越高。
ADDR
:-
表示正在运行
SZ
:虚拟内存swap
占用
WCHAN
:当前进程在内核中的名称
top
- 查看进程动态信息,每
3s
刷新一次
[root@localhost ~]# top
top - 19:27:16 up 3:36, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 98 total, 1 running, 97 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 6.2 sy, 0.0 ni, 93.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1867024 total, 1348360 free, 148256 used, 370408 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1525688 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 128164 6832 4064 S 0.0 0.4 0:02.43 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.25 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.59 kworker/u256:0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
//有很多,不写。
Tasks
系统任务信息:total
总进程数,running
正在运行的进程数,sleeping
休眠的进程数,stopped
中止的进程数,zombie
僵死无响应的进程数。
CPU
占用信息:us
用户占用,sy
内核占用,ni
优先级调度占用,id
空闲CPU,wa
I/O等待占用,hi
硬件中断占用,si
软件中断占用,st
虚拟化占用。
Mem
内存占用信息:total
总内存空间,free
空闲内存,used
已用内存,buff/cache
,物理内存和交换内存的缓冲区总和。
Swap
交换空间占用:total
总交换空间,free
空闲交换空间,used
已用交换空间,avail Mem
可用物理空间。
pgrep
- 过滤查询进程信息
-l
:同时输出对应的进程名,否则只输出PID
,不便于查看。
-U
:查询特定用户的进程
-t
:查询特定终端运行的进程
[root@localhost ~]# pgrep -l "login"
39654 systemd-logind
[root@localhost ~]# pgrep -l -U root -t tty1
40422 X
pstree
- 查看进程树
-a
:列出完整的命令信息
-u
:列出对应的用户名
-p
:列出对应的PID
号
[root@localhost ~]# pstree -aup
systemd,1 --switched-root --system --deserialize 21
├─ModemManager,39616
│ ├─{ModemManager},39631
│ └─{ModemManager},39649
├─NetworkManager,39701 --no-daemon
│ ├─dhclient,39841 -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-ens33.pid -lf...
│ ├─{NetworkManager},39704
│ └─{NetworkManager},39709
//有很多,不写。
- 不加
u
,以指定用户作为参数,可查看属于指定用户的进程数结构。
[root@localhost ~]# pstree -ap ll
未发现进程。
控制进程
&
- 运行较长时间的操作时,命令后面加
&
符号,放到后台运行
[root@localhost ~]# dd if=/dev/zero of=~/test.tmp bs=1M count=2048 &
[1] 8773
Ctrl + C
- 终止正在执行的进程
[root@localhost ~]# ping www.baidu.com
PING www.a.shifen.com (183.232.231.174) 56(84) bytes of data.
64 bytes from 183.232.231.174 (183.232.231.174): icmp_seq=1 ttl=128 time=34.6 ms
64 bytes from 183.232.231.174 (183.232.231.174): icmp_seq=2 ttl=128 time=34.9 ms
^C
--- www.a.shifen.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 34.660/34.823/34.987/0.248 ms
Ctrl + Z
- 将前台正在执行的进程调入后台并暂停执行
[root@localhost ~]# dd if=/dev/zero of=~/data.tmp bs=1M count=2048
^Z
[1]+ Stopped dd if=/dev/zero of=~/data.tmp bs=1M count=2048
jobs
- 查看当前终端在后台运行的进程任务
-l
:显示进程对应的PID
号
[root@localhost ~]# jobs -l
[1]+ 8778 Stopped dd if=/dev/zero of=~/data.tmp bs=1M count=2048
bg
- 将后台中暂停执行的任务恢复运行,并继续在后台运行,需指定任务编号作为参数
[root@localhost ~]# bg 1
fg
- 将后台中的任务恢复到前台运行,需指定任务编号作为参数
[root@localhost ~]# fg 1
kill
- 通过
PID
终止进程运行,无特定选项时,给程序发送终止信号并正常退出运行
-9
:强制终止
[root@localhost ~]# vi testfile
[1]+ Stopped vi testfile
[root@localhost ~]# jobs -l
[1]+ 8935 Stopped vi testfile
[root@localhost ~]# kill 8935
[root@localhost ~]# jobs -l
[1]+ 8935 Stopped vi testfile
[root@localhost ~]# kill -9 8935
[root@localhost ~]# jobs -l
[1]+ 8935 Killed vi testfile
killall
- 通过进程名终止运行,需要结束多个相同名称的进程时,killall更方便。
[root@localhost ~]# vi testfile1
[1]+ 已停止 vi testfile1
[root@localhost ~]# vi testfile2
[2]+ 已停止 vi testfile2
[root@localhost ~]# jobs -l
[1]- 1803 停止 vi testfile1
[2]+ 1804 停止 vi testfile2
[root@localhost ~]# killall -9 vi
[1]- 已杀死 vi testfile1
[2]+ 已杀死 vi testfile2
[root@localhost ~]# jobs -l
pkill
- 特定条件终止,与
pgrep
类似
-U
:指定用户
-t
:指定终端
[root@localhost ~]# pgrep -l -U "ll"
1875 gnome-keyring-d
1893 gnome-session-b
//有很多,不写
[root@localhost ~]# pkill -9 -U "ll"
[root@localhost ~]# pgrep -l -U "ll"