进程管理和SELinux

什么是进程

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

可通过ps aux查看系统当前正在运行的进程

[root@localhost /]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  2.2  0.3 128016  6640 ?        Ss   09:38   0:00 /usr/lib/
root          2  0.0  0.0      0     0 ?        S    09:38   0:00 [kthreadd
root          3  0.0  0.0      0     0 ?        S    09:38   0:00 [kworker/
root          4  0.0  0.0      0     0 ?        S<   09:38   0:00 [kworker/
root          5  0.0  0.0      0     0 ?        S    09:38   0:00 [kworker/
root          6  0.0  0.0      0     0 ?        S    09:38   0:00 [ksoftirq
root          7  0.0  0.0      0     0 ?        S    09:38   0:00 [migratio
root          8  0.0  0.0      0     0 ?        S    09:38   0:00 [rcu_bh]
root          9  0.2  0.0      0     0 ?        S    09:38   0:00 [rcu_sche
root         10  0.0  0.0      0     0 ?        S<   09:38   0:00 [lru-add-
root         11  0.0  0.0      0     0 ?        S    09:38   0:00 [watchdog
进程与程序

当我们执行程序的时候,就可以触发事件获得一个PID,系统会通过这个PID来判断该给这个程序怎么样的权限,且通常情况下,由这个进程衍生出来的其他进程一般情况下也会沿用这个权限

子进程与父进程

上面提到 衍生出来的进程,我们登陆到 bash,该 bash 是一个程序,并有一个 PID,在这个 bash 上执行指令,触发了相关指令的程序运行,从而得到该程序的 PID,这个 PID 就是一个子进程,原本的 bash 就是一个父进程

fork and exec

进程与父进程的关系最为复杂的在于进程相互间的呼叫。

在 Linux 的进程呼叫通常称为 fork-and-exec 的流程,进程都会借由父进程以复制(fork)的方式产生一个一模一样的子进程,然后被复制出来的子进程再以 exec 的方式来执行时机要进行的程序,最终就成为一个子进程的存在。整个流程类似下图:

在这里插入图片描述

进程管理

为什么进程管理这么重要?

  • 我们在操作系统时的各项工作都是经过某个 PID 来达成的(包括你的 bash 环境),因此,能不能进行某项工作,与该进程的权限有关
  • 当整个系统资源要被使用光的时候,可以能够找出最耗资源的哪个进程,然后删除该进程,让系统恢复正常。
  • 由于某个程序写的不好,导致产生一个有问题的进程在内存中,如何找出它,将它移除呢?
  • 如果有 5、6 项工作在系统中运行,但其中有一项工作才是最重要的,该如何让那一项重要的工作被最优先执行?
ps进程观察
ps aux		# 观察系统所有的进程数据
ps -l 		# 观察与当前终端机相关的进程
ps -lA 		# 观察系统所有的进程数据(显示内容项同 ps -l 的项一样,只不过是系统所有进程)
ps axjf		# 连同部分进程树状态

选项与参数:
	-A:所有的 process 都显示出来,与 -e 具有同样的效果
	-a:不与 terminal 有关的所有 process
	-u:有效使用者(effective user)相关的 process
	x:通常与 a 一起使用,可列出完整信息
输出格式规划:
	l:较长、较详细的将该 PID 的信息列出
	j:工作的格式(jobs format)
	-f:做一个更为完整的输出
[root@localhost /]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  2.2  0.3 128016  6640 ?        Ss   09:38   0:00 /usr/lib/
root          2  0.0  0.0      0     0 ?        S    09:38   0:00 [kthreadd
root          3  0.0  0.0      0     0 ?        S    09:38   0:00 [kworker/
root          4  0.0  0.0      0     0 ?        S<   09:38   0:00 [kworker/
root          5  0.0  0.0      0     0 ?        S    09:38   0:00 [kworker/
root          6  0.0  0.0      0     0 ?        S    09:38   0:00 [ksoftirq
root          7  0.0  0.0      0     0 ?        S    09:38   0:00 [migratio
root          8  0.0  0.0      0     0 ?        S    09:38   0:00 [rcu_bh]


[root@localhost /]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0   1589   1585  0  80   0 - 28919 do_wai pts/0    00:00:00 bash
0 R     0   1638   1589  0  80   0 - 38331 -      pts/0    00:00:00 ps

[root@localhost /]# ps -lA
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0      1      0  0  80   0 - 32004 ep_pol ?        00:00:00 systemd
1 S     0      2      0  0  80   0 -     0 kthrea ?        00:00:00 kthread
1 S     0      4      2  0  60 -20 -     0 worker ?        00:00:00 kworker
1 S     0      5      2  0  80   0 -     0 worker ?        00:00:00 kworker
1 S     0      6      2  0  80   0 -     0 smpboo ?        00:00:00 ksoftir
1 S     0      7      2  0 -40   - -     0 smpboo ?        00:00:00 migrati
1 S     0      8      2  0  80   0 -     0 rcu_gp ?        00:00:00 rcu_bh
1 S     0      9      2  0  80   0 -     0 rcu_gp ?        00:00:00 rcu_sch

对于ps -l输出内容的解析

  • F:进程旗标(process flags),说明这个进程的总结权限,常见的号码有:
    • 4:表示此进程的权限为 root
    • 1:则表示此子进程仅进行 复制(fork)而没有实际执行(exec)
  • S:进程状态(STAT),主要状态有:
    • R(Running):正在运行中
    • S(Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)
    • D:不可被唤醒的睡眠状态,通常该程序可能在等待 I/O 的情况
    • T:停止状态(stop),可能是在工作控制(背景暂停)或除错(traced)状态
    • Z(Zombie):僵尸状态,进程已终止但却无法被移除至内存外
  • UUID/PID/PPID:代表此进程被该 UID 所拥有、进程的 PID 、此进程的父进程 PID
  • C:代表 CPU 使用率,单位为百分比
  • PRI/NI:Priority/Nice 的缩写,代表此进程被 CPU 所执行的优先级,数值越小表示该进程越快被 CPU 执行。
  • ADDR/SZ/WCHAN:都与内存有关
    • ADDR:kernel function,该进程在内存的哪个部分,如果是 running 的进程,一般会显示 -
    • SZ:该进程用掉多少内存
    • WCHAN 该进程是否运行中,若为 - 表示正在运行中
  • TTY:登陆者的终端机位置,若为远程登录则使用动态终端接口(pts/n)
  • TIME:使用掉的 CPU 时间。注意:是此进程实际花费 CPU 运行的时间
  • CMD:command 的缩写,此进程的触发程序指令

对于ps aux输出的解释

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

  • USER:该 process 属于哪个使用者账户
  • PID:进程标识符
  • %CPU:该进程使用掉的 CPU 资源百分比
  • %MEM:占用的虚拟内存(KBytes)
  • RSS:占用的固定内存(KBytes)
  • TTY:在哪个终端机上面运行?
    • ?:与终端机无关
    • tty1-tty6:本机上登录的
    • pts/0等:是由网络连接进入的进程
  • STAT:目前的状态,与 ps -l 中的状态相同含义
  • START:该进程被触发启动时间(如果太久不会显示具体时间)
  • TIME:该进程实际使用 CPU 运行的时间
  • COMMAND:进程执行的指令
僵尸进程zombie

僵尸 zombie:该进程以及执行完毕或则是因故应该要终止了,但是该进程的父进程却无法完整的将该进程结束掉,而造成哪个进程一直在内存中。

在进程中它的标识是在 CMD 后面有 <defunct> 标识,例如下面这样

apache 8683 0.0 0.9 83383 9992 ?Z 14:33 0:00 /usr/sbin/httpd<defunct>

当系统不稳定时,容易造成僵尸进程,可能是因为程序有问题,或则是使用者的操作习惯不良等。

发现有僵尸进程时,应该找出来,分析原因,否则有可能一直产生僵尸进程

事实上,通常僵尸进程都已经无法管控,而直接交给 systemd 程序来负责了,偏偏 systemd 是系统第一个执行的程序,它是所有程序的父程序,无法杀掉该程序(杀掉它,系统就死了),所以,经过一段时间后,系统无法通过核心非经常性的特殊处理来将该进程删除时,那只有重启机器了

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 软件的按键
	E:切换单位显示,比如从 KB 切换为 G 显示
	c:切换 COMMAND 的信息,name/完成指令

# 范例 1:每两秒更新一次 top,观察整体信息
[root@localhost /]# top -d 2
top - 10:03:25 up 24 min,  3 users,  load average: 0.00, 0.01, 0.03
Tasks: 110 total,   1 running, 109 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.2 sy,  0.0 ni, 99.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0
KiB Mem :  1863028 total,  1481620 free,   230944 used,   150464 buff/cach
KiB Swap:  2097148 total,  2097148 free,        0 used.  1480708 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ 
   681 root      20   0  273192   4868   3736 S   0.5  0.3   0:01.82 
     1 root      20   0  128016   6648   4160 S   0.0  0.4   0:00.91 
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 
     4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 
     5 root      20   0       0      0      0 S   0.0  0.0   0:00.09 
     6 root      20   0       0      0      0 S   0.0  0.0   0:00.04 
     7 root      rt   0       0      0      0 S   0.0  0.0   0:00.00 
     8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 
     9 root      20   0       0      0      0 S   0.0  0.0   0:00.66 
    10 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 
    11 root      rt   0       0      0      0 S   0.0  0.0   0:00.01 


top 的信息基本上分为两个区域,上面 6 行,和下面的列表

  • 第一行信息:top -

    • 目前开机时间:22:20:11 这个

    • 开机到目前为止所经过的时间:up 1:05 这个

    • 已经登录系统的用户人数:4 users

    • 系统在 1、5、15 分钟的平均工作负载

      在第 15 章谈到过 batch 工作方式负载小于 0.8 就是这里显示的值了。

      表示的是,系统平均要负责运行几个进程,这里是三个值,也就是对应平均 1/5/15 分钟

      越小达标系统越空闲,若高于 1 ,那么你的系统进程执行太频繁了

  • 第二行:tasks

    显示的是目前进程的总量与各个状态(running、sleeping、stopped、zombie)的进程数量

    如果发现有 zombie 进程的话,就需要找下是哪个进程变成了僵尸进程了

  • 第三行:$Cpus

    CPU 整体负载,每个项目可使用 ? 查询。

    需要特别注意的是 wa 项,表示 I/O wait,通常系统变慢,都是 I/O 产生的问题比较大,需要特别注意该项占用的 CPU 资源,如果是多核 CPU,可以按下数字键「1」来切换成不同 CPU

  • 第四行和第五行

    目前的物理内存与虚拟内存(Mem/Swap)的使用情况。要注意的是 swap 的使用量要尽量的少,如果 swap 被大量使用,表示系统的物理内存不足

  • 第六行:当在 top 程序中输入指令时,显示状态的地方

下面的大部分都见过了,就不在此赘述了

top 预设使用 CPU 使用率 %CPU作为排序的重点,如果想要使用内存使用率排序,可以按下 M 键,要离开按下 q 键

如果想要找出最耗 CPU 资源的进程时,大多使用 top 指令,然后以 CPU 使用资源来排序(p)

kill

kill 命令用于删除执行中的程序或工作。kill 可将指定的信息送至程序。预设的信息为 SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用 SIGKILL(9) 信息尝试强制删除程序。

最常用的信号是:

  • 1 (HUP):重新加载进程。
  • 9 (KILL):杀死一个进程。
  • 15 (TERM):正常停止一个进程。

实例

杀死进程

# kill 12345

强制杀死进程

# kill -KILL 123456

发送SIGHUP信号,可以使用一下信号

# kill -HUP pid

彻底杀死进程

# kill -9 123456

显示信号

# 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

杀死指定用户所有进程

#kill -9 $(ps -ef | grep hnlinux) //方法一 过滤出hnlinux用户进程 
#kill -u hnlinux //方法二
nice程序优先级

通常可以通过 Nice 值来达到一定的优先级调整,Nice 就是上述中的 NI 值

此外,必须要注意,nice 值范围

  • nice 值范围是 -20~19
  • root 可随意调整自己或他人进程的 Nice 值,且范围为 -20~19
  • 一般使用者仅可调整自己进程的 Nice 值,且范围仅为 0~19(避免一般用户抢占系统资源)
  • 一般使用者仅可将 nice 值越调越高;比如 nice 为 5,则未来仅能调整到大于 5;

那么调整 nice 值有两种方式:

  • 一开始执行程序就立即给予一个特定的 nice 值:用 nice 指令
  • 调整某个已经存在的 PID 的 nice 值:用 renice 指令

nice指令设置初始值

nice [-n 数字] command

-n:后面接一个数值,数值范围 -20~19

# 范例 1: 用 root 给一个 nice 值为 -5,用于执行 vim,并观察该进程
[root@study ~]# nice -n -5 vim &
[2] 30185
[root@study ~]# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  8985  7780  0  80   0 - 57972 do_wai pts/0    00:00:00 su
4 S     0  9051  8985  0  90  10 - 29118 do_wai pts/0    00:00:00 bash
4 T     0 30185  9051  0  85   5 - 10791 do_sig pts/0    00:00:00 vim
0 R     0 30652  9051  0  90  10 - 12407 -      pts/0    00:00:00 ps
# 原本的 bash PRI 为 90,所以 vim 预设为 90,这里给予 nice -5,所以最终 PRI 变成了 85
# PRI越低越优先
# 要注意:不一定正好变成 85,因为会动态调整的


renice对已存在的进程nice重新调整

renice [number] PID
# 范例 1:找出自己的 bash PID ,并将该 PID 的 nice 调整到 -5
[root@study ~]# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  3426  3372  0  80   0 - 58072 do_wai pts/1    00:00:00 su
4 S     0  3443  3426  0  80   0 - 29059 do_wai pts/1    00:00:00 bash
0 R     0  3487  3443  0  80   0 - 12407 -      pts/1    00:00:00 ps
[root@study ~]# renice -5 3443
3443 (process ID) old priority 0, new priority -5
[root@study ~]# ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  3426  3372  0  80   0 - 58072 do_wai pts/1    00:00:00 su
4 S     0  3443  3426  0  75  -5 - 29059 do_wai pts/1    00:00:00 bash
0 R     0  3493  3443  0  75  -5 - 12407 -      pts/1    00:00:00 ps

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
防火墙和SELinux都是Linux系统中重要的安全机制,用于保护系统免受攻击和恶意软件的侵害。 防火墙(Firewall)是一种网络安全系统,用于监控和控制进出网络的数据流。Linux系统中常见的防火墙有iptables和firewalld。 iptables是Linux系统中常用的防火墙工具,它通过规则表(Rules Table)来控制网络数据流。iptables支持多种过滤规则和匹配条件,可以根据端口、IP地址、MAC地址等多种条件对网络流量进行过滤和控制。 firewalld是Red Hat公司推出的一种新型防火墙,它使用D-Bus接口来管理网络规则和策略。firewalld支持动态更新规则,可以对不同的网络环境进行配置,比较适合复杂的网络环境。 SElinux(Security-Enhanced Linux)是一种安全增强的Linux系统,它通过强制访问控制(Mandatory Access Control,MAC)来保护系统免受攻击。SElinux通过对文件、进程、用户等对象进行标记,对系统资源进行严格的访问控制。 SElinux的配置包括三个方面: 1. 策略(Policy):SElinux的策略规定了系统资源的访问权限,可以通过修改策略来改变系统的安全级别。 2. 标记(Labeling):SElinux通过对文件、进程、用户等对象进行标记,来控制它们的访问权限。 3. 上下文(Context):SElinux使用上下文来标识和保护系统资源,可以通过修改上下文来改变资源的安全级别。 总的来说,防火墙和SElinux都是非常重要的Linux安全机制,通过它们可以有效地保护系统免受攻击和恶意软件的侵害。在实际应用中,需要根据具体的安全需求来配置防火墙和SElinux,以达到最佳的安全效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值