进程管理
ps 命令查看进程
ps
用来显示操作系统上的进程,包括进程 UID,PID,PPID,CPU 使用情况等。
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 128176 6860 ? Ss 12:36 0:02 /usr/lib/systemd/systemd --switched-root --syst
root 2 0.0 0.0 0 0 ? S 12:36 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 12:36 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 12:36 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 12:36 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 12:36 0:00 [rcu_bh]
ps lax$ ps lax
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 0 1 0 20 0 128176 6860 ep_pol Ss ? 0:02 /usr/lib/systemd/systemd --switched-root --
1 0 2 0 20 0 0 0 kthrea S ? 0:00 [kthreadd]
1 0 3 2 20 0 0 0 smpboo S ? 0:00 [ksoftirqd/0]
1 0 5 2 0 -20 0 0 worker S< ? 0:00 [kworker/0:0H]
1 0 7 2 -100 - 0 0 smpboo S ? 0:00 [migration/0]
1 0 8 2 20 0 0 0 rcu_gp S ? 0:00 [rcu_bh]
ps -ef$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 12:36 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize
root 2 0 0 12:36 ? 00:00:00 [kthreadd]
root 3 2 0 12:36 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 12:36 ? 00:00:00 [kworker/0:0H]
root 7 2 0 12:36 ? 00:00:00 [migration/0]
root 8 2 0 12:36 ? 00:00:00 [rcu_bh]
使用信号控制进程
一个信号传递给进程可以导致软件运行中断。信号向执行中的程序报告事件。生成信号的事件可以是错误或外部事件(如 I/O 请求或计时器过期),或者来自于明确请求(如使用信号发送命令或通过键盘发送)。kill -l
获取所有信号列表:
$ 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
1) SIGHUP - 挂起信号 HUB,用于报告终端控制进程的终止。也用于请求进程重新初始化(重新加载配置)而不终止。
2) SIGINT - 键盘中断信号 INT,导致程序终止。可以被拦截或处理。通过按 INTR 组合键 (Ctrl+c) 发送。
3) SIGQUIT - 键盘退出信号 QUIT,与 SIGINT 相似,但也在终止时生成进程转储。通过按 QUIT 组合键 (Ctrl+\) 发送。
9) SIGKILL - 强制中断信号 KILL,导致立即终止程序。无法被拦截、忽略或处理;总是致命的。
15) SIGTERM - 默认信号,终止信号 TERM,导致程序终止。和 SIGKILL 不同,可以被拦截、忽略或处理。要求程序终止的友好方式;允许自我清理。
18) SIGCONT - 继续信号 CONT,发送至进程使其恢复(若已停止)。无法被拦截。即使被处理,也始终恢复进程。
19) SIGSTOP - 强制停止信号 STOP,暂停进程。无法被拦截或处理。
20) SIGTSTP - 键盘停止信号 TSTP,和 SIGSTOP 不同,可以被拦截、忽略或处理。通过按 SUSP 组合键 (Ctrl+z) 发送。
kill 命令终止进程
使用两个 Terminal 执行命令测试 kill 命令终止进程
Terminal 1 | Terminal 2 |
---|---|
|
|
| |
| |
|
|
| |
| |
| |
| |
|
进程状态监控
什么是 Linux CPU load average
在 Linux 操作系统中,top
,uptime
都会输出 load average,例如
$ uptime
21:48:22 up 1:23, 7 users, load average: 6.75, 5.66, 3.10
load average 是什么意思?load 通常指的是 CPU 执行计算的总次数,load average 是指一段时间内 CPU 执行计算的平均值,代表一段时间内感知的系统负载。Linux 通过预期服务等待时间(不仅仅是 CPU,而且包含磁盘和网络 I/O)的表示来实施平均负载计算。
计算总数(在线请求总数)- 一个 CPU 队列中运行的线程和等待的线程总数
负载总数 - 指的是一次计算历程,默认情况下每五秒运行一次
EMA(Exponential Moving Average) - 指数移动平均线是一个数学公式,用于平滑趋势数据的高点和降低当前活动的重要性,并降低数据质量
Load average - 负载平均值是负载数计算例程的结果。整体而言,它指的是最近 1 分钟、5 分钟和 15 分钟内系统活动数据的三个显示值的平均值。
$ top
top - 22:45:53 up 2:20, 7 users, load average: 0.05, 0.21, 0.30
Tasks: 256 total, 1 running, 254 sleeping, 0 stopped, 1 zombie
%Cpu(s): 1.8 us, 0.5 sy, 0.0 ni, 97.5 id, 0.1 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem : 16144748 total, 10340104 free, 2431296 used, 3373348 buff/cache
KiB Swap: 7815164 total, 7815164 free, 0 used. 12867648 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2449 root 20 0 355816 83848 58308 S 1.7 0.5 0:50.54 X
以上为默认输出:
PID - 进程 ID
USER - 用户名称,即进程所有者。
VIRT - 虚拟内存,是进程正在使用的所有内存,包括常驻集合、共享库,以及任何映射或交换的内存页。(ps 命令中标为 VSZ。)
RES - 常驻内存,是进程所用的物理内存,包括任何驻留的共享对象。(ps 命令中标为 RSS。)
S - 进程状态,可能的状态包括:
D = 不可中断睡眠
R = 运行中或可运行
S = 睡眠中
T = 已停止或已跟踪
Z = 僵停
TIME - CPU 时间,是进程启动以来总的处理时间。可以切换为包含所有过去子进程的累计时间。
COMMAND - 进程命令名称
键 | 用途 |
---|---|
? 或 h | 交互式击键操作的帮助 |
l、t、m | 切换到负载、线程和内存标题行。 |
1 | 标题中切换显示单独 CPU 信息或所有 CPU 的汇总。 |
s | 更改刷新(屏幕)率,以带小数的秒数表示(如 0.5、1、5)。 |
b | 切换反向突出显示运行中的进程;默认为仅粗体。 |
B | 在显示中使用粗体,用于标题以及运行中的进程。 |
H | 切换线程;显示进程摘要或单独线程。 |
u, U | 过滤任何用户名称(有效、真实) |
M | 按照内存使用率,以降序方式对进程列表排序。 |
P | 按照处理器使用率,以降序方式对进程列表排序。 |
k | 中断进程。若有提示,输入 PID,再输入 signal。 |
r | 调整进程的 nice 值。若有提示,输入 PID,再输入 nice_value。 |
W | 写入(保存)当前的显示配置,以便在下一次重新启动 top 时使用。 |
q | 退出 |
进程优先级
top 命令显示 nicetop - 10:02:19 up 22 min, 5 users, load average: 0.19, 0.20, 0.17
Tasks: 243 total, 1 running, 241 sleeping, 0 stopped, 1 zombie
%Cpu(s): 0.3 us, 0.0 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 16144748 total, 10624884 free, 1990956 used, 3528908 buff/cache
KiB Swap: 7815164 total, 7815164 free, 0 used. 13364976 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2518 root 20 0 340972 79996 56896 S 1.0 0.5 0:26.16 X
7063 kylin 20 0 805436 27668 15628 S 0.9 0.2 0:02.21 gnome-terminal-
6781 kylin 20 0 1048480 118184 35348 S 0.4 0.7 0:25.06 chrome
4709 kylin 20 0 2498916 383820 113728 S 0.3 2.4 1:24.83 Web Content
3729 kylin 20 0 2390604 223096 47600 S 0.1 1.4 0:27.27 gnome-shell
4656 kylin 20 0 2543556 294816 106360 S 0.1 1.8 0:49.95 firefox
6470 kylin 20 0 566572 73136 45776 S 0.1 0.5 0:18.20 chrome
NI - 真实 nice 级别
PR - 映射到大的优先级队列
$ ps axo pid,comm,nice --sort=-nice
PID COMMAND NI
43 khugepaged 19
807 alsactl 19
3989 tracker-extract 19
3993 tracker-miner-a -
4008 tracker-miner-f 19
4017 tracker-miner-u -
4386 singl <defunct> 19
42 ksmd 5
796 rtkit-daemon 1
1 systemd 0
启动程序并设定一个 nice 级别nice -n <NICELEVEL> <COMMAND>
修改已运行程序的 nice 级别renice -n <NICELEVEL> <PID>
使用 nice 和 renice 修改进程优先级
1 - 执行如下脚本,每一个 core 对应启动两个 sha1sum#!/bin/bash
NCORES=$( grep -c '^processor' /proc/cpuinfo )
PROCESSORS=$((NCORES*2))
for I in $(seq $PROCESSORS)
do
sha1sum /dev/zero &
done
2 - 查看后台进程所消耗的 CPU$ ps u $(pgrep sha1sum)
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
kylin 3021 49.3 0.0 116604 1064 pts/0 R 10:51 1:01 sha1sum /dev/zero
kylin 3022 49.4 0.0 116604 1068 pts/0 R 10:51 1:01 sha1sum /dev/zero
kylin 3023 49.3 0.0 116604 1068 pts/0 R 10:51 1:01 sha1sum /dev/zero
kylin 3024 49.5 0.0 116604 1064 pts/0 R 10:51 1:01 sha1sum /dev/zero
3 - 停止所有进程$ killall sha1sum
4 - 执行如下脚本启动进程#!/bin/bash
NCORES=$( grep -c '^processor' /proc/cpuinfo )
PROCESSORS=$((NCORES*2 - 1))
for I in $(seq $PROCESSORS)
do
sha1sum /dev/zero &
done
5 - nice 设定优先级启动进程$ nice -n10 sha1sum /dev/zero &
[1] 3259
6 - ps 命令查看每个进程 CPU 使用情况$ ps -opid,pcpu,nice,comm $(pgrep sha1sum)
PID %CPU NI COMMAND
3235 66.4 0 sha1sum
3236 64.9 0 sha1sum
3237 64.0 0 sha1sum
3259 7.0 10 sha1sum
7 - renice 修改进程优先级为 -10# renice -n -10 3259
3259 (process ID) old priority 10, new priority -10
8 - top 查看每个进程 CPU 使用情况top - 11:05:57 up 30 min, 2 users, load average: 4.72, 3.71, 2.12
KiB Mem : 48.1/1883456 [ ]
KiB Swap: 0.0/946172 [ ]
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3259 kylin 10 -10 116604 1068 788 R 98.8 0.1 2:46.60 sha1sum
3235 kylin 20 0 116604 1064 788 R 31.1 0.1 4:03.91 sha1sum
3236 kylin 20 0 116604 1068 788 R 31.1 0.1 4:01.71 sha1sum
3237 kylin 20 0 116604 1068 788 R 29.5 0.1 4:01.67 sha1sum
9 - 在如上 top 窗口中敲 r 设定进程 3259 的 nice 值为 0 后 查看 CPU 使用情况变化top - 11:08:28 up 33 min, 2 users, load average: 4.09, 3.85, 2.41
KiB Mem : 48.1/1883456 [ ]
KiB Swap: 0.0/946172 [ ]
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3259 kylin 20 0 116604 1068 788 R 49.8 0.1 4:38.58 sha1sum
3236 kylin 20 0 116604 1068 788 R 49.6 0.1 5:04.78 sha1sum
3237 kylin 20 0 116604 1068 788 R 49.6 0.1 5:04.61 sha1sum
3235 kylin 20 0 116604 1064 788 R 49.4 0.1 5:06.55 sha1sum
10 - 停止所有进程$ killall sha1sum