一个程序被加载到内存当中运行,那么内存中的那个数据就被称为进程(process)。所有系统上面运行的程序都会以进程的形式存在。还有与进程有关的SELinux加强文件存取安全强化

什么是进程(process)

触发任何一个事件时,系统都会将它定义成为一个进程,并且给予这个进程一个ID,称为PID,同时根据触发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设置

进程与程序(process & program)

  • 程序(program):通常为二进制程序,放置在存储媒介中(如硬盘、光盘、软盘、磁带等),以物理文件的形式存在
  • 进程(process):程序被触发后,执行者的权限与属性、程序的代码与所需数据等都会被加载到内存中,操作系统给予这个内存中的单元一个标识符(PID),可以说进程就是一个正在运行中的程序

子进程与父进程(PPID)

image.png
每个进程都有一个PID,某个程序的父进程通过PPID(Parent PID)来判断即可。
如果经常杀死一个进程后又重新产生,且该京城又不是crontab计划任务,那么肯定有一个父进程存在并主动生成该进程。应该先杀死父进程,才能防止子进程继续产生

fork and exec:程序调用的流程

进程都会借由父进程以赋值(fork)的方式产生一个一模一样的子进程,然后被复制下来的子进程再以exec的方式来执行实际要执行的进程,最终成为一个子进程

常驻在内存当中的进程通常都是负责一些系统所提供的功能以服务用户的各项任务,因此这些常驻进程就会被我们称为:服务(daemon)

Linux的多人多任务环境

Linux下执行一个命令时,系统会将相关的权限、属性、进程代码与数据等均加载到内存,并给予这些进程一个进程标识符(PID),最终该命令可以执行的任务则与这个PID的权限相关

多人环境

每个人登陆后获取的shell的PID不同

多任务操作

Linux可以让CPU在各个任务间切换,也就是说每个人物都仅占去CPU的几个命令次数,所以CPU每秒都能够在各个进程之间切换

多重登录环境的七个基本终端界面

在Linux当中,默认提供了六个命令行登录界面,以及一个图形界面,可以使用[Alt]+[F1]~[F7]来切换不同的终端界面

特殊的进程管理操作

Linux几乎不会宕机,可以在任何时候,将某个被困住的进程杀掉,然后再重新执行该进程而不用重新启动。
如果在Linux下命令行模式下挂掉可以切换到其他终端界面,用ps -aux找出刚刚的错误进程,然后给它kill一下,然后再回到挂掉的界面就OK

bash环境下的任务管理(job control)

可以执行多个任务

多人多任务的系统资源分配问题考虑

任务管理(job control)

这个任务管理是我们登录系统获取bash shell之后,在单一终端下同时执行多个任务的操作管理。即在一个bash下完成

什么是任务管理

执行任务管理的操作中,其实每个任务都是目前bash 的子进程,即彼此之间是有相关性的,我们无法用任务管理的方式由tty1的环境去管理tty2的bash
假设只有一个终端,因此可以出现提示字符让你操作的环境就成为前台(foreground),至于其他任务就可以放入后台(background)去暂停或运行。放入后台的任务想要运行时,它必须不能够与用户进行交互
总结:要执行bash的任务管理必须要注意的限制:

  • 这些任务所出发的进程必须来自于自己的shell 的子进程(只管理自己的bash)
  • 前台:可以控制与执行命令的这个环境称为前台的任务(froeground)
  • 后台:可以自动执行的任务,无法使用[Ctrl+C]终止,可以用是bg、fg调用该任务
  • 后台中执行的进程不能等待terminal 或shell 的输入(input)

job control 的管理

&

&:直接将命令丢到后台中执行
想要同时执行多个任务,可以将某些任务直接丢到后台环境中,让我们可以继续操作前台的任务
image.png
这样做的最大好处就是不怕被中断

[Ctrl+Z]

[Ctrl+Z]:将目前的任务丢到后台中暂停,在后台中等待

jobs

jobs [-lrs]
选项与参数:

  • -l:除了列出job number 与命令串之外,同时列出PID的码号
  • -r:仅列出正在后台run的任务
  • -s:仅列出正在后台中暂停(stop)的任务
    image.png

fg

fg(froeground):将后台任务拿到前台来处理

fg %jobnumber %可以不加 jobnumber为任务号码(数字),非PID
image.png
例如上图应为fg %1或fg 1 ,而不是fg 17844

bg

bg(background):让一个任务在后台下面运行
image.png
命令行最后多了个 &,代表该任务启动到后台

kill

kill:将该任务直接删除或重新启动
kill -signal %jobnumber
kill -l
选项与参数:

  • -l:列出目前kill能够使用的信号(signal)有哪些
  • singal:代表给予后面接的那个任务什么什么样的指示
    -1:重新读取一次参数的配置文件(类似reload)
    -2:代表由键盘输出[Ctrl+c]同样的操作
    -9:立刻强制删除一个任务
    -15:以正常的进程方式终止一项任务,与-9不同

kill后面接的数字默认是PID,如果想要管理bash的任务,就要使用%+数字这种方式了
-9这个信号通常是在强制删除一个不正常的任务时所使用的,或某些进程真的不知道怎么通过正常手段去终止时才使用
-15则是以正常步骤结束一项任务(15也是默认值)

nohup 脱机管理问题

上述的后台是bash的后台,而不是系统的后台,所以任务的后台依旧与终端有关。如果只以&方式放到后台中,然后脱机,则任务不会被执行
解决办法:

  • 1.系统计划任务at,将任务放置到系统后台,而与终端无关
  • 2.nohup命令处理,
    nohup命令可以在脱机或注销系统后,还能够让任务继续执行。nohup并不支持bash内置的命令,因此要执行的命令必须是外部命令才行

nohup [命令与参数] 在终端前台中任务
nohup [命令与参数] & 在终端后台中任务

nohup与终端无关,因此这个信息的输出会被定向至[~/nohup.out],
如果想让后台的任务在注销后还能够继续执行,那么可以使用nohup搭配&

进程管理

除此之外还有【进程的依赖性】以及所谓的【僵尸进程】等
进程管理的重要性:

  • 1.能不能执行某项任务,就与该进程的权限有关
  • 2.找出Linux最小号系统的进程,然后删除该进程,让系统恢复正常
  • 3.找出内存当中产生一个有问题的进程,然后将其删除
  • 4.如何让一项最重要的任务被最优先执行

查看进程

静态的ps、动态的top、或是利用pstree查看进程树之间关系

ps:将某个时间点的进程运行情况摘取下来

ps aux:查看系统所有的进程
ps -lA:查看系统所有的进程
ps axjf:连同部分进程树状态
选项与参数:

  • -A:所有的进程均显示出来,与 -f具有同样的效果
  • -a:不显示与终端有关的所有进程
  • -u:有效使用者(effective user)相关的进程
  • x:通常与a这个参数一起使用,可列出较完整信息
    输出格式规划:
    l:较长、较详细的将该PID的信息列出
    j:任务的格式(jobs format)
  • -f:做一个更为完整的输出
    man ps
    image.png
    一般常用的比较多的:
    只能查看自己bash进程的ps -l
    可以查看所有系统运行进程的ps aux

ps -l:进查看自己的bash相关进程

image.png
image.png

  • F:代表进程标识(process flags)。说明这个进程的权限
    4:进程的权限为root
    1:子进程仅执行复制复制(fork)而没有实际执行(exec)
  • S:代表这个进程的状态(STAT),主要的状态由:
    R(Running):该进程正在运行中
    S(Sleep):该进程目前正在睡眠状态(idle),但可以被唤醒(signal)
    D:不可被唤醒的睡眠状态,通常这个进程可能在等待I/O的情况(ex>打印)
    T:停止状态(stop),可能是在任务控制(后台暂停)或跟踪(traced)状态
    Z(Zombie):僵尸状态,进程已经终止但却无法被删除至内存外
  • UID/PID/PPID:代表此进程被该UID用户所拥有/进程的PID号码/进程的父进程PPID号码
  • C:代表CPU使用频率,单位为百分比
  • PRI/NI:Priority/Nice 的缩写,代表此进程被CPU所执行的优先级,数值越小,越快被CPU执行
  • ADDR/SZ/WCHAN:都与内存有关
    ADDR:kernel function,该进程在内存中的哪个部分,如果是running的进程,一般会显示[-]
    SZ:代表此进程用掉多少内存
    WCHAN:标识进程是否允许,若为[-]则表示正在运行
  • TTY:登录者的终端位置,若为远程登录则使用动态终端接口名称(pts/h)
  • TIME:使用的CPU时间,实际花费CPU运行的时间
  • CMD:command的缩写,造成此进程的触发进程的命令是什么

ps aux:查看系统所有进程

image.png
ps-aux显示的项目中,各字段的意义:

  • USER:该进程所属用户账号
  • PID:该进程的PID
  • %CPU:该进程使用掉的CPU资源百分比
  • %MEM:该进程所占用的物理内存百分比
  • VCZ:该进程使用掉的虚拟内存量(KB)
  • RSS:该进程占用的固定的内存量(KB)
  • TTY:该进程是在哪个终端上面运行
    ?:若与终端无关显示?
    tty1~tty6:本机上面的登录进程
    pst/0:由网络连接进入主机的进程
  • STAT:该进程目前的状态,状态显示与ps -l的S标识相同(R/S/T/Z)
  • START:该进程被触发启动的时间
  • TIME:该进程实际使用CPU运行的时间
  • COMMAND:该进程的实际命令是什么
    一般来说,ps aux 会依照PID的顺序来排序显示

ps -lA:与ps -l输出相同,但显示的进程包括系统所有的进程

image.png

ps axjf:类似进程树的进程显示

image.png

pstree:完全查看进程树

image.png
image.png
image.png

查找程序相关PID

  • ps aux | egrep '(查找内容A|查找内容B)':查找与A和B有关的程序PID
  • ps aux | grep '查找内容A'
  • ps aux | grep 查找内容A
  • ps -ef 等
    image.png

僵尸进程(zombie)

僵尸进程:原因在于该进程的原因在于该进程应该已经执行完毕,或是应该要终止了,但是该进程的父进程却无法完整地将该进程结束掉,而造成该进程一直存在内存当中
总结:系统不稳定的时候就容易造成僵尸进程,可能是因为程序写得不好,或是用户的操作习惯不良等所造成的。如果系统中有很多僵尸进程时,要找出该进程的父进程,然后做个追踪,而不是简单直接kill。
通常僵尸进程都已经无法管理,而是直接交给systemd这个进程来负责,systemd是所有进程的父进程,如果kill则系统也有问题。如果产生僵尸进程,而系统还没有办法通过内核非经常性的特殊处理来将该进程删除时,只能reboot将该进程kill掉

top:动态查看进程的变化

ps是选取一个时间点的进程状态,top则可以持续检测进程运行的状态
top [-d 数字] | top [-bnp]
选项与参数

  • -d:接秒数,整个进程界面跟新的秒数,默认是5秒
  • -b:以批量的方式执行top,通常搭配数据流重定向来将批量的结果输出为文件
  • -n:与-b搭配,意义是需要执行几次top的输出结果
  • -p:指定某些PID来执行查看监测而已
    在top执行过程中可以使用的按键命令
  • ?:显示在top当中可以输入的按键命令
  • P:以CPU的使用排序显示
  • M:以Memory的使用排序显示
  • N:以PID来排序
  • T:由该进程使用的CPU时间积累(TIME+)排序
  • k:给予某个PID一个信号(signal)
  • r:给予某个PID重新制定一个nice值
  • q:退出top
    image.png
    image.png
    top 主要分为两部分界面,上面的界面为整个系统的资源使用状态,基本上总共有六行,显示内容依序是:
    image.png
    image.png
  • 第一行:top...
    -:目前的时间
    up:开机到目前位置所经过的时间
    user:已经登录系统的用户人数
    load average:系统在1、5、15分钟的平均人物负载。数值越小代表系统越闲置,若高于1就要注意系统进程是否太过频繁了
  • 第二行:Tasks...
    目前进程的总量与个别进程在什么状态,需要注意最后的zombie数值,如果不为0,则最好检查zombie的进程
  • 第三行:%CPU(s)...
    显示的是CPU的整体负载,每个项目可使用?查看
    可以按下1来切换成不同的CPU负载率
    wa:代表I/O wait,通常系统变慢都是I/O产生的问题比较大
  • 第四行与第五行:KiB Men、KiB Swap
    表示目前的物理内存与虚拟内存的使用情况,swap的使用量要尽量地少,如果swap被用得多,表示系统的物理内存实在不足
  • 第六行:在top进程当中输入命令时,显示状态的地方
    top下半部分是每个进程使用的资源情况
  • PID:每个进程的ID
  • USER:进程所属用户
  • PR:Priority 的简写,进程的优先执行顺序,越小越早执行
  • NI:Nice的缩写,与Priority有关,越小越早执行
  • %CPU:CPU的使用率
  • %MEM:内存的使用率
  • TIME+:CPU使用时间的累加
    top默认使用CPU使用率(%CPU)作为排序的依据,按下M,则按内存使用率排序,按下P恢复,按q退出top

查看单一进程

使用echo $$ 得到个人的bash PID,在用top持续查看该PID
image.png

修改优先级NI

按下r后输入进程PID,然后输入value值
image.png
image.png
image.png

pstree

pstree [-A|U] [up]
选项与参数:

  • -A:各进程树之间的链接以ASCII字符来连接
  • -U:各进程树之间的连接以Unicode的字符来连接,在某些终端界面下可能会有错误
  • -p:并同时列出每个进程的PID
  • -u:并同时列出每个进程的所属账号名称
    image.png
    pstree -Aup
    image.png
    如果要找进程之间的相关性,pstree非常适合,并且可以找到父进程。
    上图可知所有的进程都是依附在systemd这个进程下面的,PID为1,是Linux内核所主动调用的第一个进程。

进程的管理

进程之间是可以相互控制的,通过给予该进程一个信号(signal)去告知该进程你想要它做什么
image.png
常用的信号有1、2、9、15、19
1:类似reload,重新加载配置文件启动
2:类似[Ctrl+c]来中断一个进程的运行
9:强制杀死,如果该进程执行到到一半,可能会有残留的文件,例如缓存文件等
15:正常的方式结束进程
19:类似[Ctrl+z]暂停一个进程的运行

kill -signal PID

kill后面直接加数字和 %number 的情况是不同的

killal -signal 命令名称:直接通过进程名字杀死进程

直接按名称杀死进程
省略找出进程PID,再以PID 杀死进程的步骤
killal [-iIe] [command name]
选项与参数:

  • -i:interactive(互动),若需要删除时,会出现提示字符
  • -e:exact,表示command name要一致,但整个完整的命令要一致
  • -I:命令名称(可能含参数)忽略大小写
    image.png

关于进程的执行顺序

查看系统资源信息

特殊文件与进程

SELinux初探

CentOS提供了很多管理SELinux的命令与功能,因此在整体架构上面是单纯且容易操作管理的。建议不要关闭SELinux

什么是SELinux

由美国国家安全局(NSA)开发
为Security Enhanced Linux 的英文缩写,即安全强化Linux

设计目标:避免资源的误用

最初系统问题的大部分都在于内部员工的资源误用,实际由外部发动的攻击反而没有这么严重。
SELinux是在进行进程、文件等详细权限配置时依据的一个内核模块。由于启动网络服务的也是进程,因此刚好也是能够控制网络服务能否读写系统资源的一道关卡。

传统的文件权限与账号的关系:自主访问控制(DAC)

以策略规则制定特定进程读取特定文件:强制访问控制(MAC)


这个家伙很懒,啥也没有留下😋