11_进程管理和SELinux

什么是进程

在系统中触发任何一个事件,系统都会把它定义成一个进程,并且给这个进程一个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 -l
     1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
     6) 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

我们来介绍下每一列的含义

  1. F:表示进程的权限,4表示权限是root
  2. S:进程状态,R running S sleep T stop Z zombie
  3. UIP PID PPID:用户ID、进程ID、父进程ID
  4. C:CPU使用率
  5. PRI/NI:CPU执行的优先级
  6. ADDR 表示在内存中的位置,正在运行一般是- ;SZ代表占用多少内存; WCHAN 表示运行状态,运行中是-
  7. TTY:登录者的终端位置
  8. TIME:使用CPU的时间
  9. 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命令可以查看所有进程,其中一些含义是

  1. MEM:占用内存的物理百分比
  2. VSZ:占用的虚拟内存
  3. RSS:占用的固定内存量
  4. TTY:该进程在哪个终端上进行,与终端无关则显示?。tty1-6是本机上的登录进程,吐过是pts/0,说明是网络连接进入主机的进程
  5. STAT:进程状态
  6. START:进程触发时间
  7. TIME:实际CPU运行时间
  8. 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   

每一行的含义分别是:

  1. 目前时间、up系统已运行时间、用户数、表示1/5/15分钟的平均任务负载数量,在1以下是正常的,越小代表系统越空闲
  2. tasks:目前总进程数量和各个状态,这里要注意的是僵尸进程数量
  3. %CPUs:cpu的整体负载。这里一般关注wa,它代表IO的wait。一般系统变慢都是因为IO
  4. 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个方式:

  1. 一开始执行进程时就用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
    
  2. 调整某个已存在的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 -mt
                  total        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 ~]# uptime
     10: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 st
     2  0      0 168304   2072 322588    0    0    42    26  143  348  0  0 99  0  0
     0  0      0 168304   2072 322620    0    0     0     0  143  318  0  0 100  0  0
     1  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权限来决定有无读写权限。它的缺陷在于:

  1. root具有最高权限。所以root被攻破就可以获取所有目录的读写权限。
  2. 用户可以获取进程从而修改文件资源的访问权限。

强制访问控制MAC,以策略规则制定特定进程读取特定的文件。Selinux就是通过MAC的方式来管理进程的。这样就解决了上面两个缺陷。

  • 25
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值