什么是进程(Process)
在Linux系统中:触发任何一个事件时,系统都会将它定义成为一个进程,并且给予这个进程一个ID,成为PID,同时依据触发这个进程的用户与相关属性关系,给予这个PID一组有效的权限设置。
进程与程序(process & program)
程序:通常位二进制程序放置在存储媒介中(如硬盘、光盘、软盘、磁带等),以物理文件的形式存在;
进程:程序被处罚后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载到内存中,操作系统并给予这个内存内的单元一个标志符(PID),可以说,进程就是一个正在运行中的程序。
fork and exec:过程调用的流程
进程之间都会通过父进程以复制(fork)的方式产生一个一模一样的子进程,然后被复制出来的子进程再以exec的方式来执行实际要进行的进程,最终就成为一个子进程的存在。
系统与网路服务:常驻在内存的进程
常驻在内存当中的进程通常都负责一些系统所提供的功能以服务用户各项任务,因此这些常驻进程就会被我们称为服务(daemon)。
Linux的多用户、多任务环境
多用户环境
Linux系统上面具有许多中不同的账号,每种账号都有其特殊的权限,只有一人具有至高无上的权利,那就是root(系统管理员)。
多任务行为
因为CPU的高速运行,在每秒之间可以在各个工作间进行切换。
工作管理(job control)
当我们登录系统取得bash shell之后,在单一终端机下同时进行多个工作的行为管理。
什么是工作管理
在进行工作管理的行为中,其实每个工作都是目前bash的子进程,及彼此之间都有相关性。我们无法以job control的方式由tty1的环境去管理tty2的bash。
要进行bash的job control必须要注意到的限制是:
这些工作所触及到的进程必须来自你的shell的子进程;
前台:你可以控制与执行命令的这个环境成为前台(foreground)的工作;
后台:可以自行运行的工作,你无法使用Ctrl+c终止它,可以使用bg/fg调用该工作;
后台中“执行”的进程不能等待terminal/shell的输入(input)。
job control的管理
直接将命令丢到后台中“执行”的 &
输入命令后,在该命令之后加上一个“&”代表将该命令丢到后台中,此时bash会给予这个命令一个job number。
将目前的工作丢到后台中“暂停”:Ctrl - z
在vi的一般模式下,按下Ctrl+z,屏幕上会出现[1],表示这是第一个工作,而那个+代表最近一个被丢进后台的工作,且目前在后台默认会被取用的那个工作(与fg这个命令有关)。而那个Stopped,代表工作状态(暂停)。
查看目前的后台工作状态:jobs
命令:jobs [-lrs]
-l:除了列出job number与命令串之外,同时列出PID的号码;
-r:仅列出正在后台run的工作;
-s:仅列出正在后台当中暂停的工作。
“+”代表最近被放到后台的工作号码,“-”代表最近最后第二个被放置到后台的工作号码。
将后台工作拿到前台来处理:fg
命令:fg %jobnumber
fg默认取出的是那个“+”的工作。%可有可无。
让工作在后台下的状态变成运行中:bg
命令:bg %jobnumber
管理后台当中的工作:kill
命令:kill -signal %jobnumbe
kill -l
-l:列出目前kill能够使用的信号(signal)有哪些;
signal:代表给予后面的那个工作有什么样的指示。用man 7 signal可知: -1:重新读取以此参数配置文件(类似reload);
-2:代表与由键盘输入Ctrl+c同样的操作;
-9:立刻强制删除一个文件;
-15:已正常的程序方式终止一项工作。
脱机管理问题
nohup可以让你在脱机或注销系统后,还能够让工作继续进行。命令如下:
在终端机前台中工作:nohup [命令与参数]
在终端机后台中工作:nohup [命令与参数] &
进程管理
进程的查看
ps:将某个时间点的进程运行情况选取下来,命令如下:
查看系统所有的进程数据:ps aux
也是能够查看所有系统的数据:ps -lA
连同部分进程树状态:ps axjf
-A:所有的进程均显示出来,与-e有相同的作用;
-a:不与terminal有关的所有进程;
-u:有效用户(effective user)相关的进程;
x:通常与a一起用,可列出较完整的信息;
输出格式规划:
l:较长、较详细地将该PID的信息列出;
j:工作的格式(job format);
-f:做一个更为完整的输出。
仅查看自己的bash相关进程:ps -l
查看系统所有的进程:ps aux
top:动态查看进程的变化,命令如下:
top [-d 数字] | top [-bnp]
-d:整个进程界面更新的秒数,默认是5秒;
-b:以批次的方式执行top;
-n:与-b搭配,需要进行几次top的输出结果;
-p:指定某些个PID来进行查看监测而已。
top执行过程中可以使用的按键命令:
?:显示在top当中可以输入的按键命令;
P:以CPU的使用资源排序显示;
M:以内存得到使用资源排序显示;
N:以PID来排序;
k:给予某个PID一个信号(signal);
r:给予某个PID重新制定一个nice值;
q:离开top软件。
pstree命令:
pstree [-A|U] [-up]
-A:各进程树之间的连接以ASCII字符来连接;
-U:各进程树之间的连接以utf8码的字符来连接,在某些终端接口下可能会有错误;
-p:同时列出每个进程的PID;
-u:同时列出每个进程的所属账号名称。
killall -signal 命令名称
killall [-iIe] [command name]
-i:interactive的意思,交互式的,若需要删除时,会出现提示符给用户;
-e:exact的意思,表示后面接的command name要一致,但整个完整的命令不能超过15个字符;
-I(大写i):命令名称(可能含参数)忽略大小写。
关于进程的执行顺序
Priority与Nice值
PRI(Priority)值越低代表越优先的意思,不过这个PRI值是由内核动态调整的,用户无法直接调整PRI值。
当nice值位负值时,那么该程序就会降低PRI值,即会变得较优先被处理;
需要留意:
nice值可调整的范围:-20~19;
root可以随意调整自己或他人的进程的Nice值;
一般用户只可以调整自己进程的nice值,且范围为:0~19;
一般使用者仅可将nice值越调越高。
给予某进程nice值的两种方式:
一开始执行程序就立即给予一个特定的nice值:用nice命令;
调整某个已经存在的PID的nice值:用renice命令。
nice命令:
nice [-n 数字] command
-n:后面接一数值,范围:-20~19;
renice命令:
renice [number] PID
系统资源查看
free:查看内存使用情况,命令如下:
free [-b|-k|-m|-g] [-t]
-b|-k|-m|-g:单位;
-t:在输出的最终结果中显示物理内存与swap的总量。
uname:查看系统与内核相关信息,命令如下:
uname [-asrmpi]
-a:所有系统相关的信息;
-s:系统内核名称;
-r:系统内核版本;
-m:被系统硬件名称;
-p:CPU的类型;
-i:硬件的平台(ix86)。
uptime:查看系统启动时间与工作负载
netstat:跟踪网络,命令如下:
netstat -[atunlp]
-a:见目前系统上所有的连接、监听、Socket数据都列出来;
-t:列出tcp网络数据包的数据;
-u:列出udp网络数据报的数据;
-n:不列出进程的服务名称,以端口号(port number)来显示;
-l:列出目前正在网络监听(listen)的服务;
-p:列出该网络服务的进程PID。
dmesg:分析内核产生的信息
vmstat:监测系统资源变化,命令如下:
CPU/内存等信息:vmstat [-a] [延迟 [总计检测次数]]
内存相关:vmstat [-fs]
设置显示数据的单位:vmstat [-S 单位]
与磁盘有关:vmstat [-d]
与磁盘有关:vmstat [-p 分区]
-a:使用inactive/active(活跃与否)代替buffer/cache的内存输出信息;
-f:开机到目前位置系统复制(fork)的进程数;
-s:将一些事件导致的内存变化情况列表说明;
-S:后面接单位,让显示的数据有单位;
-d:列出磁盘的读写总量统计表;
-p:后面列出分区,可显示该分区的读写总量统计表。
特殊文件与程序
查询已打开文件或已执行程序打开的文件
fuser:通过文件(或文件系统)找出正在使用该文件的程序,命令:
fuser [-umv] [-k [i] [-signal]] file/dir
-u:除了进程的PID之外,同时列出该进程的所有者;
-m:后面接的那个文件名会主动上提到该文件系统的最顶层,对umount不成功很有效。
-v:可以列出每个文件与程序还有命令的完整相关性;
-k:找出使用该文件/目录的PID,并试图以SIGKILL这个信号给予该PID;
-i:必须与-k配合,在删除PID之前会询问用户的意愿;
-signal:默认是SIGKILL(-9).
lsof:列出被进程所打开的文件名,命令:
lsof [-aUu] [+d]
-a:多项数据需要“同时成立”才显示出结果;
-U:仅列出Unix like系统的socket文件类型;
-u:后面接username,列出该用户相关进程所打开的文件;
+d:后面接目录,即找出某个目录下面已经被打开的文件。
pidof:找出某个正在执行的进程的PID
pidof [-sx] program_name
-s:仅列出一个PID而不列出所有的PID;
-x:同时列出该program name可能的PPID那个进程的PID。
SELinux初探
什么是SELinux?
SELinux其实就是”Security Enhanced Linux“的缩写,字面意思就是安全强化的Liunx。其实,SELinux是在进行程序、文件等权限设置依据的一个内核模块。
传统的文件权限与账号关系:自主式访问控制,DAC
基本上就是依据进程的所有者与文件资源的rwx权限来决定有无访问的能力。
以政策规则制定特定程序读取特定的文件:委托访问控制,MAC
SELinux的运行模式
SELinux是通过MAC的方式来控管进程,它控制的主体是进程,而目标则是该进程能否读取的”文件资源“。
CentOS 7.x里面提供三个主要的政策,分别是:
targeted:针对网络服务限制较多,针对本机限制较少,是预设的政策;
minimum:由target修订而来,仅针对选择的进程来保护!
mls:完整的SELinux限制,限制方面较为严格。
利用ls -Z可得到类似下面的结果:
-rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
其中的安全上下文主要用冒号分成三个字段:
Identify(身份识别):role(角色):type(类型)
身份识别常见几种类型:
unconfined_u:不受限的用户;
system_u:系统用户。
角色一般有:
object_r:代表的是文件或目录等文件资源;
system_r:代表的是进程。
类型(最重要!)
类型字段在文件与进程的定义不太相同,分别是:
type:在文件资源(Object)上面称为类型(Type);
domain:在主体程序(Subject)中则称为域(domain)了。
主体与目标的之间是否有可以读写的权限与进程的domain及文件的type有关。
SELinux的启动、关闭与查看
目前,SELinux依据启动与否,共有三种模式,分别如下:
enforcing:强制模式,代表SELinux正在运行中,且已经正确开始限制domain/type了;
permissive:宽容模式,代表SELinux正在运行中,不过仅会有警告信息并不会实际限制domain/type的访问。可以用来作为SELinux的调试只用;
disable:关闭,SELinux并没有什么实际运行。
查看SELinux目前的模式,命令:
getenforce
查看SELinux的政策(policy),命令:
sestatus [-vb]
-v:检查列于/etc/sestatus.conf内的文件与程序的安全上下文内容;
-b:将目前策略的规则布尔值列出,即某些规则(rule)是否要启动(1/0)。
ESLinux的配置文件就是:/etc/selinux/config
SELinux的启动与关闭
让SELinux模式在enforcing与permissive之间切换的方法:
setenforce [0|1]
0:转成permissive宽容模式;
1:转成Enforcing强制模式。
SELinux的策略与规则管理
SELinux各个规则的布尔值查询,命令:
getsebool [-a] [规则的名称]
-a:列出目前系统上的所有SELinux规则的布尔值位开启或关闭值。
SELinux各个规则规范的主体进程能够读取的文件SELinux type查询seinfo,sesearch,命令:
seinfo [-Atrub]
-A:列出SELinux的状态、规则布尔值、身份识别、角色、类型等信息;
-t:列出SELinux的所有类型(type)种类;
-r:列出SELinux的所有角色(role)种类;
-u:列出SELinux的所有身份标识(user)种类;
-b:列出所有规则的种类(布尔值)。
sesearch [-a] [-s 主体类型] [-t 目标类型] [-b 布尔值]
-a:列出该类型或布尔值的所有相关信息;
-t:后面还要接类型;
-b:后面还要接布尔值的规则。