07 进程管理、任务管理和内核管理
07 进程管理、任务管理和内核管理
1 进程管理
进程的基础概念:运行中的程序
1.1 pstree命令
pstree -p #查看进程数
pstree 用户名 #查看具体用户的进程
1.2 ps命令
ps
a #选项包括所有终端中的进程
x #选项包括不链接终端的进程
u #选项显示进程所有者的信息
1.3 top命令
top -d n #指定刷新时间,默认为3秒
#在top之后排序
p #按CPU使用率对进程进行排序,默认降序
m #按内存使用量对进程进行排序,默认降序
n #按进程ID排序,默认降序
o #设置排序的关键字,可以根据需要选择不同的排序依据
1.4 vmstat命令
#用于平衡系统负载活动,帮助用户快速获取当前系统的负载情况
vmstat [options] [delay [count]]
常用选项
-a|--active #分开显示活动和非活动内存
-s|--stats #显示事件统计
-d|--disk #统计磁盘设备相关信息
-D|--disk-sum #综合统计磁盘
-S|--unit <char> #指定显示单位 k|K|m|M
-w|--wide #以宽格式显示
-t|--timestamp #显示时间
1.5 free命令
free -m #以MB为单位进行显示
free -h #以人类友好视图的形式进行显示
free -t #添加统计行
#清空缓存,以root权限执行
echo 3 > /proc/sys/vm/drop_caches #释放页面缓存(pagecache)、目录项缓存(dentries)和索引节点缓存(inodes)
1.6 lsof命令-查看进程打开文件
lsof -Pti #根据端口获取进程id
root@test-VirtualBox:~# ss -tunlp | grep 22
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=707,fd=3))
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=707,fd=4))
root@test-VirtualBox:~# lsof -Pti :22
707
1365
1482
1618
1676
1.7 kill命令
#传递信号
kill -l #查看信号的多少
root@test-VirtualBox:~# kill -l #一共65个信号,结束某个进程一般选择9
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) 无需关闭进程而让其重读配置文件
2) 中止正在运行的进程,相当于ctrl+c
3) 相当于ctrl+\
9) 强制杀死正在运行的进程,可能会导致数据丢失,慎用
15) 终止正在运行的进程,默认信号
18) 继续运行
19) 后台休眠
#kill命令针对单个进程,杀死进程的时候可使用kill命令杀父进程(前提你知道哪一个PID代表的是父进程)
#killall命令针对某个程序,因为程序一般会发起多个进程
#pkill和killall类似
2 任务管理
nohup:真正放到后台执行
sleep 10000 & #当前终端下放到后台运行,终端结束,任务也结束
nohup sleep 10000 >> /dev/null 2>&1 & #后台执行的程序信息无论正确还是错误全部放入/dev/null,关闭终端,任务依然还在
#任务的前后台切换及结束
root@test-VirtualBox:~# sleep 10000
^Z
[1]+ 已停止 sleep 10000
root@test-VirtualBox:~# bg
[1]+ sleep 10000 &
root@test-VirtualBox:~# jobs
[1]+ 运行中 sleep 10000 &
root@test-VirtualBox:~# kill %1
root@test-VirtualBox:~# jobs
[1]+ 已终止 sleep 10000
root@test-VirtualBox:~# fg
-bash: fg: 当前: 无此任务
定时任务:需要守护进程服务
#一次性任务atd
at
#周期性任务crond
crontab
-系统级别--全局 #编辑主配置文件/etc/crontab(ubuntu)
--个人标识
-用户级别--用户 #使用命令crontab -e(ubuntu)会生成临时文件
#一般存在于/var/spool/cron目录下

根据示例写法,可以根据自己的定义来进行更改,特殊定义语句如下:

本次所使用的crontab中,周和日的关系为“或”,以最小值为准。
3 内核管理
3.1 基础知识
3.1.1 内核流派
| 对比维度 | 单内核(Monolithic Kernel) | 微内核(Micro Kernel) | 混合内核(Hybird Kernel) |
|---|---|---|---|
| 核心设计目标 | 高性能有限,集成所有核心功能以减少模块通信开销 | 高稳定性与安全性有限,通过极简内核隔离故障影响 | 平衡性能与灵活性,核心功能保效率,非核心功能可动态调整 |
| 功能部署位置 | 进程调度、内存管理、文件系统、设备驱动等所有核心功能全在内核空间运行 | 仅保留进程调度、内存管理、IPC等最基础功能在内核空间,文件系统、驱动等全在用户空间以服务运行。强制拆分功能到用户空间,牺牲部分性能换稳定性。 | 基础核心功能(进程、内存管理)在内核空间,驱动、文件系统等可灵活选择内核/用户空间(或通过动态模块加载) |
| 模块通信方式 | 模块间直接函数调用(同一内核空间,无跨空间通信开销) | 强制通过进程间通信(IPC)实现模块交互(用户太服务于内核、服务之间均需IPC),兼顾性能与扩展性。 | 内核空间内模块直接调用,跨空间模块按需使用IPC或动态加载机制 |
| 典型代表系统 | Linux(传统架构)、BSD、早期Unix | QNX、Minix、早期WindowsNT设计 | Windows(NT之后架构)、Linux(通过LKM实现类混合特性) |
| 核心优势 | 性能高(减少IPC通信损耗,适合服务器、嵌入式等效率敏感场景);实现简单(功能集中,无需复杂通信机制) | 稳定性强(用户态服务崩溃不影响内核,适合汽车电子、医疗设备等高可靠场景);权限隔离严格(安全性高) | 兼顾性能(核心功能内核态高效运行)与灵活(非核心功能可动态扩展,无需重启内核);适配场景广(桌面、服务器、嵌入式均可优化) |
| 核心缺点 | 耦合度高(修改功能需重编内核并重启,灵活性差);风险集中(内核故障易导致系统整体崩溃) | 性能开销大(频繁IPC通信降低效率,复杂场景下性能低于单内核);开发复杂(需设计高效IPC机制) | 设计复杂(需权衡功能部署边界,避免内核态膨胀);调试难度高(跨空间交互问题定位困难) |
3.1.2 内核特点
Linux内核通过模块化设计实现了类似混合内核的灵活扩展能力,核心围绕“按需加载、动态管理”。
LKM:可加载内核模块
3.1.2.1 模块化设计
模块化(Modularity)
把内核功能拆分为 “核心内核” + “可选模块”,让非关键功能(如特定硬件驱动、文件系统、网络协议)以 独立模块文件(.ko 格式 ) 存在,而非硬编码进内核。
实现方式
1 代码层面:
内核模块需按特定框架编写(定义 module_init() 加载函数、module_exit() 卸载函数 ,声明模块元数据如许可证、作者 )。
2 编译层面:
可通过内核配置(make menuconfig )选择 “编译进内核” 或 “编译为模块”;模块编译后生成独立.ko 文件。
3 运行层面:
模块可动态插入内核,或从内核移除,无需改动核心内核代码。
3.1.2.2 动态加卸载
支持动态装卸载(Dynamic Loading/Unloading)
系统运行时,通过工具(insmod/modprobe )把 .ko 模块 “插入” 内核,使其成为内核功能的一部分。
例:插入 vfat.ko 模块支持 FAT32 文件系统,插入 nvidia.ko 驱动 GPU 。
细节:modprobe 更智能,会自动解决模块依赖(如加载某驱动需先加载依赖的基础模块 )。
3.1.3 内核参数【刚开始无需多看-初中级运维无需多看,节省精力】
略
3.1.4 内核模块

查看内核配置文件:
root@test-VirtualBox:~# cat /boot/config-6.8.0-40-generic
#
# Automatically generated file; DO NOT EDIT.
# Linux/x86 6.8.12 Kernel Configuration
#
CONFIG_CC_VERSION_TEXT="x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0"
CONFIG_CC_IS_GCC=y
CONFIG_GCC_VERSION=120300
CONFIG_CLANG_VERSION=0
CONFIG_AS_IS_GNU=y
CONFIG_AS_VERSION=23800
CONFIG_LD_IS_BFD=y
CONFIG_LD_VERSION=23800
CONFIG_LLD_VERSION=0
CONFIG_CC_CAN_LINK=y
CONFIG_CC_CAN_LINK_STATIC=y
CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y
CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y
CONFIG_GCC_ASM_GOTO_OUTPUT_WORKAROUND=y
CONFIG_TOOLS_SUPPORT_RELR=y
CONFIG_CC_HAS_ASM_INLINE=y
CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y
CONFIG_PAHOLE_VERSION=125
CONFIG_IRQ_WORK=y
CONFIG_BUILDTIME_TABLE_SORT=y
CONFIG_THREAD_INFO_IN_TASK=y
.
.
.
.
.
.
.
.
CONFIG_ARCH_USE_MEMTEST=y
CONFIG_MEMTEST=y
# CONFIG_HYPERV_TESTING is not set
# end of Kernel Testing and Coverage
#
# Rust hacking
#
# end of Rust hacking
# end of Kernel hacking
内核的配置文件有12000+行,删除部分仅做展示用。
在功能选择中,y(使用频繁),m(使用较低)可在上述模块中进行设置
3.1.5 命令解读
lsmod #用于列出当前系统中已加载的内核模块信息
modeprobe #用于智能地加载和卸载内核模块。它会自动处理模块之间的依赖关系。
insmod #用于将制定的内核模块直接插入到内核中加载,但它不会自动处理模块的依赖关系。
modinfo #检查模块的依赖信息
remod #将指定的内核模块从当前正在运行的Linux内核中移除。
#上述代码示例如下
root@test-VirtualBox:~# lsmod |wc -l
63
root@test-VirtualBox:~# lsmod | grep ipip #未找到ipip模块
root@test-VirtualBox:~# modinfo ipip #查看ipip模块的信息
filename: /lib/modules/6.8.0-90-generic/kernel/net/ipv4/ipip.ko
alias: netdev-tunl0
alias: rtnl-link-ipip
license: GPL
description: IP/IP protocol decoder library
srcversion: D823EA84FF60E08CB3A274B
depends: ip_tunnel,tunnel4
retpoline: Y
intree: Y
name: ipip
vermagic: 6.8.0-90-generic SMP preempt mod_unload modversions
sig_id: PKCS#7
signer: Build time autogenerated kernel key
sig_key: 25:67:28:E3:81:D2:64:45:A6:28:21:AF:C8:3E:D9:1B:C9:2C:9C:AD
sig_hashalgo: sha512
signature: 7B:7F:EF:94:EB:30:2E:E4:B9:2A:9C:49:FE:A5:2E:A7:2D:F8:F9:97:
4F:CA:79:40:30:DF:D4:E3:24:8B:71:86:77:90:01:0C:37:C1:22:30:
DD:42:28:50:35:98:17:61:5A:DE:14:31:F4:0F:FC:3A:E4:72:BF:93:
DD:6F:42:58:74:65:D9:44:6E:08:5E:99:FB:4B:54:98:4C:26:39:92:
71:47:6E:26:9E:F4:07:33:BE:20:8D:65:89:6C:54:5F:D9:74:E6:2B:
BC:88:FA:52:2B:88:A0:F7:7E:CC:45:BB:67:E0:FA:B2:CD:29:55:C1:
68:DB:58:ED:A1:0B:64:B7:5E:A9:00:C2:47:88:A5:BF:81:BE:A3:BC:
EF:62:98:D3:E8:F1:BC:DB:07:CE:93:18:07:0E:F8:B6:D9:67:65:BA:
1D:4C:03:6B:EE:55:9B:F0:7B:F4:0E:95:B3:D8:2F:CB:DE:A9:AD:EB:
EC:DF:61:C8:90:01:6C:E8:D6:22:D2:DE:03:A8:1D:11:BC:8E:DA:31:
11:34:F8:1C:43:1D:ED:7D:DC:17:A5:A2:7D:85:0C:76:23:4C:91:25:
04:BC:D9:55:EC:29:53:36:48:F9:4E:AB:4E:A1:EE:8C:86:BE:20:1B:
91:B2:36:64:35:FB:09:E8:8F:3F:49:9D:75:8C:AC:61:02:90:D0:EA:
F5:8E:23:A5:AA:8D:53:2B:6D:D2:BF:6B:99:39:70:BF:EC:AD:35:D4:
50:72:CC:01:B3:F7:0E:BF:C0:F0:F8:F6:15:8A:F4:33:42:FC:53:D2:
6D:20:36:23:C5:68:9D:79:D4:7A:CE:80:57:AF:17:EB:39:DC:C1:76:
A8:B6:E9:89:94:87:BE:B9:D1:D0:2C:A0:69:56:1C:4A:25:D5:19:27:
B7:E8:2E:E5:63:CC:D5:4F:03:86:6C:0C:D2:87:1C:1A:90:43:AA:08:
D6:A6:92:2C:06:A0:A0:D5:15:57:A3:CC:0B:4D:02:CC:37:A7:CB:4D:
1D:A9:1D:A0:C7:AF:7C:E5:7B:64:A3:02:F9:26:61:C2:14:03:63:8D:
DE:A2:A6:05:C0:77:78:41:A1:C0:15:36:C2:8B:67:5D:5A:5B:F5:08:
21:89:6E:1B:18:28:B1:CE:A9:D3:3C:56:22:21:1E:16:4A:DC:CF:72:
B5:70:FA:9C:1B:40:9F:75:00:81:7D:64:B9:65:AF:42:E4:AA:A2:B2:
B0:EA:9D:CE:10:D9:30:3F:99:AF:47:7A:CC:88:99:A3:C5:AF:FD:11:
76:F9:3F:03:28:6C:28:AF:42:0B:ED:F9:80:38:1D:8A:00:AC:8F:FA:
48:AA:75:A1:DA:5F:49:41:C2:2C:49:DA
parm: log_ecn_error:Log packets received with corrupted ECN (bool)
root@test-VirtualBox:~# modprobe ipip #根据depends使用modprobe命令自己解决依赖然后加载ipip模块
root@test-VirtualBox:~# lsmod | grep ipip
ipip 20480 0
tunnel4 12288 1 ipip
ip_tunnel 32768 1 ipip
root@test-VirtualBox:~# rmmod ipip
root@test-VirtualBox:~# lsmod |grep ipip
root@test-VirtualBox:~# lsmod |grep tun
tunnel4 12288 0
ip_tunnel 32768 0
root@test-VirtualBox:~# rmmod tunnel4
root@test-VirtualBox:~# rmmod ip-tunnel
#看,或者编辑内核参数,使用systcl命令
root@test-VirtualBox:~# sysctl -a | wc -l #一共有1019个相关选项,但实际使用的不多
1019
root@test-VirtualBox:~# sysctl -h
用法:
sysctl [options] [variable[=value] ...]
选项:
-a, --all display all variables
-A alias of -a
-X alias of -a
--deprecated include deprecated parameters to listing
-b, --binary print value without new line
-e, --ignore ignore unknown variables errors
-N, --names print variable names without values
-n, --values print only values of the given variable(s)
-p, --load[=<file>] read values from file
-f -p 的别名
--system read values from all system directories
-r, --pattern <expression>
select setting that match expression
-q, --quiet do not echo variable set
-w, --write enable writing a value to variable
-o 没有效果
-x 没有效果
-d -h 的别名
-h, --help 显示此帮助然后离开
-V, --version 显示程序版本然后离开
欲了解更多详细信息,请参见 sysctl(8)。
#修改Linux内核参数
#临时方式
echo
sysctl -w 'key=value'
#永久方式
vim /etc/sysctl.conf
vim /etc/sysctl.d/xxx.conf
#应用
sysctl -p
#尝试修改一下(Ubuntu/22.04不行,升级到24.04后直接可用)
root@test-VirtualBox:~# sysctl -a | grep ip_forward
net.ipv4.ip_forward= 0
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
root@test-VirtualBox:~# sysctl -w "net.ipv4.ip_forward = 1"
net.ipv4.ip_forward = 1
root@test-VirtualBox:~# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
#永久方式
root@test-VirtualBox:~# tree /etc/sysctl.d/
/etc/sysctl.d/
├── 10-bufferbloat.conf
├── 10-console-messages.conf
├── 10-ipv6-privacy.conf
├── 10-kernel-hardening.conf
├── 10-magic-sysrq.conf
├── 10-map-count.conf
├── 10-network-security.conf
├── 10-ptrace.conf
├── 10-zeropage.conf
├── 99-sysctl.conf -> ../sysctl.conf
└── README.sysctl
1 directory, 11 files
root@test-VirtualBox:~# vim /etc/sysctl.conf
#添加以下代码到文件末尾
net.ipv4.ip_forward = 1
root@test-VirtualBox:~# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
#sysctl -p生效
root@test-VirtualBox:~# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
root@test-VirtualBox:~# sysctl -p
net.ipv4.ip_forward = 1
root@test-VirtualBox:~# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
浙公网安备 33010602011771号