什么是进程
在系统中触发任何一个事件,系统都会把它定义成一个进程,并且给这个进程一个ID,也就是PID。同时也会根据触发这个进程的用户与相关属性,给这个PID一个相应的权限设置。
进程与程序
如何触发事件呢,执行程序或者命令,都会触发事件从而获得PID。
-
父进程和子进程:某些进程会触发衍生的进程,也就是子进程和父进程。我们可以用bash创建一个新的bash,可以看到它的PPID就是上一个Bash。PPID也就是Parent PID,就是父进程。
[root@node4 ~]# bash [root@node4 ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1329 1327 0 80 0 - 28919 do_wai pts/0 00:00:00 bash 4 S 0 1721 1329 0 80 0 - 28919 do_wai pts/0 00:00:00 bash 0 R 0 1740 1721 0 80 0 - 38331 - pts/0 00:00:00 ps
-
系统的常驻进程:大多数命令的进程,在执行完毕后就会消失了。有很多系统进程一直在后台持续运行,这种进程称作服务daemon。
Linux的多人多任务环境
由于系统会为每个登录的人赋予不同的PID,并根据登录用户给与不同的权限,这就使得Linux很适合多人多任务环境的工作。Linux的CPU调度机制非常优秀,可以最大限度的压榨CPU性能,让每个用户觉得自己是在独享这台机器。
Linux默认提供了7个基本终端界面,包括6个命令行界面和一个图形界面。Linux系统很少会死机,因为它可以在任何时候将某个卡主的进程杀掉,然后重新运行该进程。这也是Linux系统比较稳定的其中一个原因。
任务管理
-
后台执行命令&
如果在同一个bash中想要并行执行多个任务,就要使用&命令,例如
tar -zpcvf /tmp/etc/tar.gz /etc > /tmp/log.txt 2>&1 &
我们将执行过程中的log输出到txt中,这样就不会让屏幕花花绿绿的影响操作了
-
暂停任务【ctrl+z】例如我们在用vim编辑一个文件时,希望先退出来看下某个文件的路径,这是可以在vim的一般模式使用ctrl+z让任务暂停执行
[root@node4 ~]# vim hello.txt [1]+ 已停止 vim hello.txt
-
查看后台任务:jobs 通过jobs命令可以看到后台的任务状态
[root@node4 ~]# jobs [1]+ 已停止 vim hello.txt# 其他参数 -l: 列出PID -r:仅列出正在执行的任务 -s:仅列出已暂停的任务
-
将后台任务拿到前台执行:fg
fg %任务号码[root@node4 ~]# fg %1 vim hello.txt ---将会继续执行
-
让后台任务从暂停变成执行:bg
-
杀任务:kill,这是一个比较常用的命令,使用-l参数可以看到kill可以使用的所有信号号码
[root@node4 ~]# kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1。。。。。。
kill的语法是
kill -信号号码 %任务号码 比较常用的信号有 -1:相当于reload -2:相当于键盘输入ctrl+c -9:强制删除,一般强制杀进程就用它 -15:以正常的进程 方式终止任务
kill命令后面默认跟的是PID,本例中我们来关闭上面的vim
[root@node4 ~]# jobs [1]+ 已停止 vim hello.txt [root@node4 ~]# kill -9 %1[1]+ 已停止 vim hello.txt [root@node4 ~]# jobs [1]+ 已杀死 vim hello.txt [root@node4 ~]# jobs
此时用-9强制关闭vim,就会产生缓存文件,下次打开时会问你要不要恢复。
-
脱机执行。如果希望进程在断开连接后继续执行,可以使用nohup命令
进程管理
查看进程ps
查看进程可以使用ps命令
# 查看当前bash的进程
[root@node4 ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1329 1327 0 80 0 - 28970 do_wai pts/0 00:00:00 bash
0 R 0 4796 1329 0 80 0 - 38331 - pts/0 00:00:00 ps
我们来介绍下每一列的含义
- F:表示进程的权限,4表示权限是root
- S:进程状态,R running S sleep T stop Z zombie
- UIP PID PPID:用户ID、进程ID、父进程ID
- C:CPU使用率
- PRI/NI:CPU执行的优先级
- ADDR 表示在内存中的位置,正在运行一般是- ;SZ代表占用多少内存; WCHAN 表示运行状态,运行中是-
- TTY:登录者的终端位置
- TIME:使用CPU的时间
- CMD:触发此进程的命令
# 查看所有进程
[root@node4 ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 133572 3852 ? Ss 20:36 0:02 /usr/lib/systemd/systemd --switched-root -
root 2 0.0 0.0 0 0 ? S 20:36 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 20:36 0:00 [kworker/0:0H]
......
aux命令可以查看所有进程,其中一些含义是
- MEM:占用内存的物理百分比
- VSZ:占用的虚拟内存
- RSS:占用的固定内存量
- TTY:该进程在哪个终端上进行,与终端无关则显示?。tty1-6是本机上的登录进程,吐过是pts/0,说明是网络连接进入主机的进程
- STAT:进程状态
- START:进程触发时间
- TIME:实际CPU运行时间
- COMMAND:实际命令是什么
动态查看进程top
# 查看进程,2s更新一次
[root@node4 ~]# top -d 2
top - 21:05:13 up 29 min, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 90 total, 1 running, 89 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 995460 total, 192824 free, 491400 used, 311236 buff/cache
KiB Swap: 1999868 total, 1999868 free, 0 used. 358428 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1031 mysql 20 0 1315648 392188 15168 S 0.5 39.4 0:15.26 mysqld 1 root 20 0 125376 3852 2584 S 0.0 0.4 0:01.29 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
每一行的含义分别是:
- 目前时间、up系统已运行时间、用户数、表示1/5/15分钟的平均任务负载数量,在1以下是正常的,越小代表系统越空闲
- tasks:目前总进程数量和各个状态,这里要注意的是僵尸进程数量
- %CPUs:cpu的整体负载。这里一般关注wa,它代表IO的wait。一般系统变慢都是因为IO
- Mem、Swap物理内存和虚拟内存的使用情况。如果虚拟内容使用量很多,那就说明物理内存不够用了
下面是各个进程的具体情况,默认是按照CPU使用率排序的。如果希望按照进程ID排序,可以按下M,恢复可以按P。按Q退出。
查看进程树pstree
pstree可以查看关联的进程
pstree [-A|U] [-up]
-A 各进程之间的连接以ASCII字符连接
-U 以UNICODE字符连接
-p 列出每个PID
-u 列出用户
[root@node4 ~]# pstree -Aup
systemd(1)-+-NetworkManager(536)-+-{NetworkManager}(586)| `-{NetworkManager}(588)|-VGAuthService(486)|-agetty(549)|-anacron(2525)|-atd(543)|-auditd(424)---{auditd}(425)|-crond(540)|-dbus-daemon(491,dbus)|-mysqld_safe(818)---mysqld(1031,mysql)-+-{mysqld}(1214)
可以看到systemd是所有进程的父进程,因为它是Linux内核主动调用的第一个进程,所以它PID是1
进程的管理
通过给进程发送一个信号,来进行进程管理。
- kill -signal PID
- kill -signal 命令名称
进程的执行优先级
通过PRI和Nice的值,可以指定进程的优先级
- nice的值在-20~19之间
- Root可以调整所有用户的nice值,调整范围在-20~19
- 一般用户可以调整自己的nice值,调整范围在0~19
- 一般用户只能将nice值调高
调整nice值有2个方式:
-
一开始执行进程时就用nice命令给予一个特定的nice值
nice [-n 数字] command # 用nice指定5的nice值运行vim [root@node4 ~]# nice -n -5 vim & [1] 3178 [root@node4 ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1389 1385 0 80 0 - 28919 do_wai pts/0 00:00:00 bash 4 T 0 3178 1389 0 75 -5 - 36808 do_sig pts/0 00:00:00 vim 0 R 0 3182 1389 0 80 0 - 38331 - pts/0 00:00:00 ps[1]+ 已停止 nice -n -5 vim [root@node4 ~]# kill -9 %1[1]+ 已停止 nice -n -5 vim
-
调整某个已存在的PID的nice值,使用renice命令
renice [number] PID # 调整bash的优先级为5 [root@node4 ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1389 1385 0 80 0 - 28950 do_wai pts/0 00:00:00 bash 0 R 0 3292 1389 0 80 0 - 38331 - pts/0 00:00:00 ps [1]+ 已杀死 nice -n -5 vim [root@node4 ~]# renice -5 1389 1389 (进程 ID) 旧优先级为 0,新优先级为 -5 [root@node4 ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1389 1385 0 75 -5 - 28970 do_wai pts/0 00:00:00 bash 0 R 0 3347 1389 0 75 -5 - 38331 - pts/0 00:00:00 ps
查看系统的其他信息
-
free:查看系统内存
free -[b/k/m/g/h] -t -s N -b:默认内存单位是KB,可以手动指定单位 -t:输出最终结果的sum值 -s:刷新显示结果[root@node4 ~]# free -mttotal used free shared buff/cache available Mem: 972 487 179 7 305 342 Swap: 1952 0 1952 Total: 2925 487 2132
-
uname:查看系统和内核的相关信息
uname [-asrmpi] -a:显示所有信息 -s:内核名称 -r:内核版本 -m:系统硬件架构 -p:cpu类型 -i:硬件平台 [root@node4 ~]# uname -a Linux node4 3.10.0-1160.108.1.el7.x86_64 #1 SMP Thu Jan 25 16:17:31 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
-
uptime:查看系统运行时间和任务负载
[root@node4 ~]# uptime10:36:47 up 49 min, 1 user, load average: 0.03, 0.04, 0.05
-
netstat:追踪网络或socket文件
netstat -[atunlp] -a:列出所有连接、监听、socket信息 -t、-u:列出tcp或者udp网络封包信息 -n:以端口号来显示 -l:列出目前正在网络监听的服务 -p:列出该网络服务的PID# 列出目前系统上监听的网络连接和PID [root@node4 ~]# netstat -tulnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 791/sshd tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1032/mysqld tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1301/nginx: master tcp6 0 0 :::22 :::* LISTEN 791/sshd
-
dmesg:分析内核产生的信息
-
vmstat:检测系统资源变化
# 统计目前cpu状态,每秒一次,共3次 [root@node4 ~]# vmstat 1 3 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st2 0 0 168304 2072 322588 0 0 42 26 143 348 0 0 99 0 00 0 0 168304 2072 322620 0 0 0 0 143 318 0 0 100 0 01 0 0 168304 2072 322620 0 0 0 0 141 306 0 0 100 0 0
其他与进程相关的命令
-
fuser:用文件系统找出正在使用该文件的进程
# 找出目前目录使用的PID账号的权限 [root@node4 ~]# fuser -uv .用户 进程号 权限 命令 /root: root 1389 ..c.. (root)bash
-
lsof:找出进程使用的文件
lsof不加参数,默认会列出所有呗开启的文件和设备 lsof [-aUu] [+d] -a: -U:仅列出UNIX-like系统的socket文件类型 -u:后面跟用户名,列出该用户的相关进程使用的文件 +d:后面跟目录,某个目录下进程使用的文件
-
pidof:找出某个正在执行的进程的PID
[root@node4 ~]# pidof nginx 1303 1301
SElinux简介
SElinux是linux中的一个安全模块,是为了弥补传统的账号权限管理漏洞而产生的。
传统的文件权限是DAC,自主访问控制。依据进程的拥有者与文件资源的rwx权限来决定有无读写权限。它的缺陷在于:
- root具有最高权限。所以root被攻破就可以获取所有目录的读写权限。
- 用户可以获取进程从而修改文件资源的访问权限。
强制访问控制MAC,以策略规则制定特定进程读取特定的文件。Selinux就是通过MAC的方式来管理进程的。这样就解决了上面两个缺陷。