进程管理知识点总结:
一,什么是进程
1,进程与程序
(1)程序 (program):一般为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体文
件的型态存在;
(2)进程 (process):程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载内存中, 操
做系统并给予这个内存内的单元一个标识符 (PID),能够说,进程就是一个正在运做中的程序。
(3)父进程和子进程:ps -l
父进程:pid
子进程:ppid
注:平常运维中,kill杀死一个进程,过一会还会自动生成,通常是有crontab计划任务或者父进程自动生成;所
以要删除父进程
(4)fork and exec:进程呼叫的流程
在 Linux 的进程呼叫一般称为 fork-and-exec 的流程!进程都会由父进程以复制 (fork) 的方式产生一个
如出一辙的子进程, 而后被复制出来的子进程再以 exec 的方式来执行实际要进行的程序,最终就
成为一个子进程的存在;
(5)系统或网络服务:常驻在内存的进程php
2,Linux 的多人多任务环境
(1)多人环境:每一个人登入后取得的 shell 的 PID 不一样
(2)多任务行为:每一个工做都仅占去 CPU 的几个指令次数,因此 CPU 每秒可以在各个进程之间进行切换
(3)多重登入环境的七个基本终端窗口:在 Linux 当中,默认提供了六个文字界面登入窗口,以及一个图形界面,可使用 [Alt]+[F1].....[F7]来切换不一样的终端机界面
(4)特殊的进程管理行为:linux每一个进程之间多是独立的,也可能有相依性, 只要到独立的进程当中,能够切换到其余的终端机界面删除有问题的那个进程
(5)bash 环境下的工做管理 (job control):cp file1 file2 & 放后台执行,能够继续执行其它指令
(6)多人多任务的系统资源分配问题考虑:node
二,工做管理 (job control)
1,什么是工做管理?
(1)工做管理就是当登入系统取得 bash shell 后,在单一终端机接口下同时进行多个工做行为管理
(2)要进行 bash 的 job control 必需要注意到的限制是:
1,这些工做所触发的进程必须来自于你 shell 的子进程(只管理本身的 bash);
2, 前景:你能够控制与下达指令的这个环境称为前景的工做 (foreground);
3, 背景:能够自行运做的工做,你没法使用 [ctrl]+c 终止他,可以使用 bg/fg 呼叫该工做;
4, 背景中『执行』的进程不能等待 terminal/shell 的输入(input)mysql
2,job control 的管理
(1)直接将指令丢到背景中『执行』的 &linux
[1] 8932nginx
注解:
在中括号内的号码为工做号码 (job number),该号码与 bash 的控制有关。
8932 是这个工做在系统中的 PID。至于后续出现的数据是 tar 执行的数据流, 因为咱们没有加上数据流重导向,因此会影响画面!
[1]+ Done tar zcf /tmp/etc.tar.gz /etc
表明 [1] 这个工做已经完成 (Done) ,该工做的指令则是接在后面那一串指令列
正确的完美写法为:tar - zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
(2)将『目前』的工做丢到背景中『暂停』:[ctrl]-zsql
[3]+ Stopped vim a
注解:
[3] ,表示这是第三个工做shell
选项与参数:
-l :除了列出 job number 与指令串以外,同时列出 PID 的号码;
-r :仅列出正在背景 run 的工做;
-s :仅列出正在背景当中暂停 (stop) 的工做。
经常使用选项:
jobs -l
jobs -r
jobs -s
(4)将背景工做拿到前景来处理:fg foregroundvim
选项与参数:
%jobnumber :jobnumber 为工做号码(数字)
(5)让工做在背景下的状态变成运做中: bg (工做未结束脱机后,工做不会继续进行)安全
选项与参数:
%jobnumber :jobnumber 为工做号码(数字)
(6)管理背景当中的工做: killbash
选项与参数:
-l :这个是 L 的小写,列出目前 kill 可以使用的信号 (signal) 有哪些?
signal :信号用 man 7 signal 可知:
-1 :从新读取一次参数的配置文件 (相似 reload);
-2 :表明与由键盘输入 [ctrl]-c 一样的动做;
-9 :马上强制删除一个工做;
-15:以正常的进程方式终止一项工做。与 -9 是不同的。
3,脱机管理
nohup [ 指令与 参数 ] 在终端机前景中工做
nohup [ 指令与 参数 ] & 在终端机背景中工做
nohup 并不支持 bash 内建的指令,必需要是外部指令才行
例如:
#!/bin/bash
/bin/sleep 500s
/bin/echo "I have slept 500 seconds."
[2] 14812
若是你再次登入的话,再使用 pstree 去查阅你的进程,会发现 sleep500.sh 还在执行中
三,进程管理
1,进程的观察
(1)查看进程 ps
经常使用组合:
ps auxf
ps -lA
ps axjf
ps aux | egrep '(cron|rsyslog)'
(2)top :动态查看进程的变化
echo $$
14836 <==这个数字是咱们 bash 的 PID
(3)pstree
经常使用组合:
pstree -A
pstree -Aup
2,进程的管理
(1)查看进程信号
(2)经常使用信号详解:
1 HUP 启动被终止的进程,可以让该 PID 从新读取本身的配置文件,相似从新启动
2 INT 至关于用键盘输入 [ctrl]-c 来中断一个进程的进行
9 KILL 表明强制中断一个进程的进行,若是该进程进行到一半, 那么还没有完成的部分可能会有『半产品』产
生,类 似 vim 会有 .filename.swp 保留下来。
15 TERM 以正常的结束进程来终止该进程。因为是正常的终止, 因此后续的动做会将他完成。不过,若是该进
程已经发生问题,就是没法使用正常的方法终止时, 输入这个 signal 也是没有用的。
19 STOP 至关于用键盘输入 [ctrl]-z 来暂停一个进程的进行
(3)kill -signal PID
kill -HUP $(ps aux | grep 'rsyslogd' | grep -v 'grep'| awk '{print $2}')
(4)killall -signal 指令名称
killall [-iIe] [command name]
选项与参数:
-i :interactive 的意思,交互式的,若须要删除时,会出现提示字符给用户;
-e :exact 的意思,表示『后面接的 command name 要一致』,但整个完整的指令不能超过 15 个字符。
-I :指令名称(可能含参数)忽略大小写。
3,关于进程的执行顺序
(1)Priority 与 Nice 值
PRI(new) = PRI(old) + nice
PRI 值越低越优先。PRI 值是由核心动态调整的, 用户没法直接调整 PRI值的;
当 nice 值为负值时,那么该进程就会下降 PRI 值,即会变的较优先被处理。
nice 值可调整的范围为 -20 ~ 19 ;
root 可随意调整本身或他人进程的 Nice 值,且范围为 -20 ~ 19 ;
通常使用者仅可调整本身进程的 Nice 值,且范围仅为 0 ~ 19 (避免通常用户抢占系统资源);
通常使用者仅可将 nice 值越调越高,例如原本 nice 为 5 ,则将来仅能调整到大于 5;
调整nice的方法:
一开始执行程序就当即给予一个特定的 nice 值:用 nice 指令;
调整某个已经存在的 PID 的 nice 值:用 renice 指令
(2)nice :新执行的指令即给予新的 nice 值
nice [-n 数字] command
选项与参数:
-n :后面接一个数值,数值的范围 -20 ~ 19。
例如: nice -n -5 vim &
(3)renice :已存在进程的 nice
renice [number] PID
选项与参数:
PID :某个进程的 ID
例如:renice -5 14836
4,系统资源的观察
(1)free :观察内存使用状况
free [ [-b|-k|-m|-g|-h] [-t] [-s N -c N]
选项与参数:
-b 以Byte为单位显示内存使用状况。
-k 以KB为单位显示内存使用状况。
-m 以MB为单位显示内存使用状况。
-g 以GB为单位显示内存使用状况。
-o 不显示缓冲区调节列。
-s<间隔秒数> 持续观察内存使用情况。
-c 统计次数
-t 显示内存总和列。
-V 显示版本信息。
经常使用选项:
free -m -s 5 -c 5
free -g -s 5 -c 5
(2)uname :查阅系统与核心相关信息
uname [- - asrmpi]
选项与参数:
-a :全部系统相关的信息,包括底下的数据都会被列出来;
-s :系统核心名称
-r :核心的版本
-m :本系统的硬件名称,例如 i686 或 x86_64 等;
-p :CPU 的类型,与 -m 相似,只是显示的是 CPU 的类型!
-i :硬件的平台 (ix86)
(3)uptime :观察系统启动时间与工做负载 /proc/loadavg
(4)netstat :查看网络链接,路由表,接口统计,化装链接,和组播会员
netstat -[atunlp]
选项与参数:
-a :将目前系统上全部的链接、监听、Socket 数据都列出来
-t :列出 tcp 网络封包的数据
-u :列出 udp 网络封包的数据
-n :不以进程的服务名称,以端口号 (port number) 来显示;
-l :列出目前正在网络监听 (listen) 的服务;
-p :列出该网络服务的进程 PID
经常使用选项:
netstat -lanptu
netstat -r
(5)dmesg :分析核心产生的讯息
经常使用命令:
dmesg | more
dmesg | grep -i sda
(6)vmstat :侦测系统资源变化
四,特殊文件与进程
(1)具备 SUID/SGID 权限的指令执行状态
SUID 的程序被通常用户执行过程:
SUID 权限仅对二进制程序(binary program)有效;
执行者对于该程序须要具备 x 的可执行权限;
本权限仅在执行该程序的过程当中有效 (run-time);
执行者将具备该程序拥有者 (owner) 的权限。
例子:
[wpf@47-95-251-172 ~]$ passwd
Changing password for user wpf.
Changing password for wpf.
(current) UNIX password:
[1]+ Stopped passwd
[wpf@47-95-251-172 ~]$ pstree -uA
init-+-aliyun-service
|-crond
|-2[dhclient]
|-irqbalance
|-6[mingetty]
|-mysqld_safe---mysqld(mysql)---9[{mysqld}]
|-nginx---8[nginx(www)]
|-php-fpm---28[php-fpm(www)]
|-rsyslogd---3[{rsyslogd}]
|-sshd-+-sshd---bash
| -sshd---sshd(wpf)---bash-+-passwd(root)<br/>|
-pstree
passwd执行时具备SUID权限给PID的程序权限
查询系统中具备SUID/SGID的权限:
find / -perm /6000
(2)/proc/表明的意义
进程都是在内存当中,内存中的数据是写入/proc目录
各个进程的PID都是以目录的型态存在/proc中
proc目录下文件与对应的内容:
/proc/cmdline 加载 kernel 时所下达的相关指令与参数!查阅此文件,可了解指令是如何启动的!
/proc/cpuinfo 本机的 CPU 的相关信息,包含频率、类型与运算功能等
/proc/devices 这个文件记录了系统各个主要装置的主要装置代号,与 mknod 有关!
/proc/filesystems 目前系统已经加载的文件系统!
/proc/interrupts 目前系统上面的 IRQ 分配状态。
/proc/ioports 目前系统上面各个装置所配置的 I/O 地址。
/proc/kcore 这个就是内存的大小,不要读他!
/proc/loadavg 还记得 top 以及 uptime 吧?没错!上头的三个平均数值就是记录在此!
/proc/meminfo 使用 free 列出的内存信息,在这里也可以查阅到!
/proc/modules 目前咱们的 Linux 已经加载的模块列表,也能够想成是驱动程序!
/proc/mounts 系统已经挂载的数据,就是用 mount 这个指令呼叫出来的数据!
/proc/swaps 到底系统挂加载的内存在哪里?使用掉的 partition 就记录在此!
/proc/partitions 使用 fdisk -l 会出现目前全部的 partition 吧?在这个文件当中也有纪录!
/proc/uptime 就是用 uptime 的时候,会出现的信息!
/proc/version 核心的版本,就是用 uname -a 显示的内容!
/proc/bus/ 一些总线的装置,还有 USB 的装置也记录在此!
(3)查询已开启 文件 或已执行进程开启之 文件
fuser :从文件( 或文件系统) 找出正在使用该文件的进程
fuser [-umv] [-k [i] [-signal]] file/dir
选项与参数:
-u :除了进程的 PID 以外,同时列出该进程的拥有者;
-m :后面接的那个档名会主动的上提到该文件系统的最顶层,对 umount 不成功颇有效!
-v :能够列出每一个文件与进程还有指令的完整相关性!
-k :找出使用该文件/目录的 PID ,并试图以 SIGKILL 这个讯号给予该 PID;
-i :必须与 -k 配合,在删除 PID 以前会先询问使用者意愿!
-signal:例如 -1 -15 等等,若不加的话,预设是 SIGKILL (-9) !
USER PID ACCESS COMMAND
888.tbzkzx.cc.access.log:
root 11259 F.... (root)nginx
www 11260 F.... (www)nginx
ACCESS详解:
c :此进程在当前的目录下(非次目录);
e :可被触发为执行状态;
f :是一个被开启的文件;
r :表明顶层目录 (root directory);
F :该文件被开启了,不过在等待回应中;
m :可能为分享的动态函式库;
经常使用选项:
fuser -uv /proc
fuser -umv log
fuser -mki /home
(4)lsof :列出被进程所开启的文件名
选项与参数:
-a :多项数据须要『同时成立』才显示出结果时!
-U :仅列出 Unix like 系统的 socket 文件类型;
-u :后面接 username,列出该使用者相关进程所开启的文件;
+d :后面接目录,亦即找出某个目录底下已经被开启的文件!
经常使用选项:
lsof filename
lsof -i :80
lsof -u root -a -U
(5)pidof :找出某支正在执行的程序的 PID
pidof [-sx] program_name
选项与参数:
-s :仅列出一个 PID 而不列出全部的 PID
-x :同时列出该 program name 可能的 PPID 那个进程的 PID
五,SELinux初探
1,什么是SELinux Security Enhanced Linux 安全强化linux
(1)当初设计的目标:避免资源的误用
SELinux 是在进行进程、文件等细部权限设定依据的一个核心模块
SELinux可以控制网络服务可否存取系统资源(由于启动网络服务的也是进程)
(2)传统的文件权限与帐号关系:自主式访问控制, DAC
自主式访问控制 (Discretionary Access Control, DAC)就是依据进程的拥有者与文件资源的 rwx 权限来决定有无存取的能力;存在root 具备最高的权限和root 具备最高的权限问题:
(3)以策略规则订定特定进程读取特定 文件 :委任式访问控制, MAC Mandatory Access Control
MAC对特定的进程与特定的文件资源来进行权限的控管
上图例子:
WWW 服务器软件的达成进程为 httpd 这支程序, 而默认状况下, httpd 仅能在 /var/www/ 这个目录底下存取文件,若是 httpd 这个进程想要到其余目录去存取数据时, 除了规则设定要开放外,目标目录也得要设定成 httpd 可读取的模式 (type) 才行;
2,SELinux 的运做模式
主体(Subject):SELinux主要想要管理的就是进程;
目标(Objext):主体进程可否存取的目标资源,通常就是文件系统;
策略(Policy):详细的规则来指定不一样的服务开放某些资源的存取
targeted:针对网络服务限制较多,针对本机限制较少,是预设的政策;
minimum:由 target 修订而来,仅针对选择的进程来保护!
mls:完整的 SELinux 限制,限制方面较为严格
安全性本文 (security context) :
上图的重点在『主体』如何取得『目标』的资源访问权限
(1)主体进程必需要经过 SELinux 政策内的规则放行后,就能够与目标资源进行安全性本文的比对,
(2)若比对失败则没法存取目标,若比对成功则能够开始存取目标
(1)安全性文本 (security context)
安全性本文是放置到文件的 inode 内的,所以主体进程想要读取目标文件资源时,一样须要读取 inode , 这 inode 内就能够比对安全性本文以及 rwx等权限值是否正确,而给予适当的读取权限依据;
查看安全性本文:
-rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
安全性本文主要用冒号分为三个字段:
Identify:role:type
身份识别:角色:类型
详细说明:
身份识别 (Identify) :
a)unconfined_u:不受限的用户(在不受 SELinux 所限制的 bash 进程所产生的文件, 其身份识别大多就是 unconfined_u 『不受限』用户)
b)system_u:系统用户,大部分就是系统本身产生的文件
角色 (Role) :
a)object_r:表明的是文件或目录等文件资源;
b)system_r:表明的是进程啦!不过,通常使用者也会被指定成为 system_r !
类型 (Type) ( 最重要!) :
一个主体进程能不能读取到这个文件资源,与类型字段有关;
类型字段在文件与进程的定义不太相同:
a)type:在文件资源 (Object) 上面称为类型 (Type);
b)domain:在主体进程 (Subject) 则称为领域 (domain) !
(2)进程与 文件 SELinux type字段的相关性
系统中的进程在SELinux底下的安全本文:
LABEL PID TTY TIME CMD
system_u:system_r:init_t:s0 1 ? 00:00:03 systemd
身份识别 角色 该对应在 targeted 的意义
unconfined_u unconfined_r 通常可登入使用者的进程
system_u system_r 系统帐号的非交谈式的系统运做进程
在预设的 target策略下,最重要的字段是类型字段 (type), 主体与目标之间是否具备能够读写的权限,与进程的 domain 及文件的 type 有关
crond例子:
system_u:system_r:crond_t:s0-s0:c0.c1023 1338 ? 00:00:01 crond
system_u:system_r:crond_t:s0-s0:c0.c1023 1340 ? 00:00:00 atd
drwxr-xr-x. root root system_u:object_r:system_cron_spool_t:s0 /etc/cron.d
-rw-r--r--. root root system_u:object_r:system_cron_spool_t:s0 /etc/crontab
-rwxr-xr-x. root root system_u:object_r:crond_exec_t:s0 /usr/sbin/crond
3,SELinux 三种模式的启动、关闭与观察
(1)SELinux的三种模式:
enforcing:强制模式,表明 SELinux 运做中,且已经正确的开始限制 domain/type 了;
permissive:宽容模式:表明 SELinux 运做中,不过仅会有警告讯息并不会实际限制 domain/type 的存取。这种模式能够运来做为 SELinux 的 debug 之用;
disabled:关闭,SELinux 并无实际运做。
SELinux的三种模式与上面谈到的政策规则、安全本文的关系:
查看SELinux模式:getenforce
Enforcing
查看SELiunx的策略:
选项与参数:
-v :检查列于 /etc/sestatus.conf 内的文件与进程的安全性本文内容;
-b :将目前政策的规则布尔值列出,亦即某些规则 (rule) 是否要启动 (0/1) 之意;
配置文件: /etc/selinux/config
(2)SELinux 的启动与关闭
SELinux 模式在 enforcing 与permissive 之间切换的方法为
选项与参数:
0 :转成 permissive 宽容模式;
1 :转成 Enforcing 强制模式
注意:
在某些特殊的状况下,从 Disabled 切换成 Enforcing 后,居然有一堆服务没法启动,提示在 /lib/xxx 里面的数据没有权限读取,因此启动失败。这大可能是因为在从新写入 SELinux type(Relabel) 出错之故,使用 Permissive 就没有这个错误。那如何处理呢?最简单的方法就是在 Permissive 的状态下,使用『 restorecon -Rv / 』从新还原全部 SELinux 的类型,就可以处理这个错误!
4,SELinux 策略规则管理
(1)SELinux 各个规则的布尔值查询 getsebool
选项与参数:
-a :列出目前系统上面的全部 SELinux 规则的布尔值为开启或关闭值
(2)SELinux 各个规则规范的主体进程可以读取的 文件 SELinux type 查询 seinfo, sesearch
yum ×××tall -y setools-console-*
选项与参数:
-A :列出 SELinux 的状态、规则布尔值、身份识别、角色、类别等全部信息
-u :列出 SELinux 的全部身份识别 (user) 种类
-r :列出 SELinux 的全部角色 (role) 种类
-t :列出 SELinux 的全部类别 (type) 种类
-b :列出全部规则的种类 (布尔值)
选项与参数:
-A :列出后面数据中,容许『读取或放行』的相关数据
-t :后面还要接类别,例如 -t httpd_t
-b :后面还要接 SELinux 的规则,例如 -b httpd_enable_ftp_server
范例一:找出 crond_t 这个主体进程可以读取的文件 SELinux type
sesearch -A -s crond_t | grep spool
范例二:找出 crond_t 是否可以读取 /etc/cron.d/checktime 这个咱们自定义的配置文件?
ll -Z /etc/cron.d/checktime
sesearch -A -s crond_t | grep admin_home_t
(3)修改 SELinux 规则的布尔值 setsebool
选项与参数:
-P :直接将设定值写入配置文件,该设定数据将来会生效的!
5,SELinux安全本文的修改
(1)使用 chcon 手动修改 文件的 的 SELinux type
chcon [-R] [-t type] [-u user] [-r role] 文件
chcon [-R] -- reference= 范例文件 文件
选项与参数:
-R :连同该目录下的次目录也同时修改;
-t :后面接安全性本文的类型字段!例如 httpd_sys_content_t ;
-u :后面接身份识别,例如 system_u; (不重要)
-r :后面街角色,例如 system_r; (不重要)
-v :如有变化成功,请将变更的结果列出来
--reference=范例文件:拿某个文件当范例来修改后续接的文件的类型!
例子:
chcon -v -t net_conf_t /etc/cron.d/checktime
chcon -v -reference=/etc/shadow /etc/cron.d/checktime
(2)使用 restorecon 让 让 文件 恢复正确的 SELinux type
选项与参数:
-R :连同次目录一块儿修改;
-v :将过程显示到屏幕上
例子:
restorecon -Rv /etc/cron.d
(3)semanage 默认目录的安全性本文查询与修改
semanage {login|user|port|interface|fconte xt|translation} -l
semanage fcontext - - {a|d|m} [-frst] file_spec
选项与参数:
fcontext :主要用在安全性本文方面的用途, -l 为查询的意思;
-a :增长
-m :修改;
-d :删除。
重点回顾:1,程序 (program):一般为 binary program ,放置在储存媒体中 (如硬盘等),为实体文件的型态存在;2,进程 (process):程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载内存中, 操做系统并给予这个内存内的单元一个标识符 (PID),能够说,进程就是一个正在运做中的程序。3,程序彼此之间是有相关性的,故有父进程与子进程之分。而 Linux 系统全部进程的父进程就是 init 这个PID 为 1 号的进程。4,在 Linux 的进程呼叫一般称为 fork-and-exec 的流程!进程都会藉由父进程以复制 (fork) 的方式产生一个如出一辙的子进程, 而后被复制出来的子进程再以 exec 的方式来执行实际要进行的程序,最终就成为一个子进程的存在。5,常驻在内存当中的进程一般都是负责一些系统所提供的功能以服务用户各项任务,所以这些常驻程序就会被咱们称为:服务 (daemon)。6,在工做管理 (job control) 中,能够出现提示字符让你操做的环境就称为前景 (foreground),至于其余工做就可让你放入背景 (background) 去暂停或运做。7,与 job control 有关的按键与关键词有: &, [ctrl]-z, jobs, fg, bg, kill %n 等;8,进程管理的观察指令有: ps, top, pstree 等等;9,进程之间是能够互相控制的,传递的讯息 (signal) 主要透过 kill 这个指令在处理;10,进程是有优先级的,该项目为 Priority,但 PRI 是核心动态调整的,用户只能使用 nice 值去微调 PRI11,nice 的给予能够有: nice, renice, top 等指令;12,vmstat 为至关好用的系统资源使用状况观察指令;13,SELinux 当初的设计是为了不使用者资源的误用,而 SELinux 使用的是 MAC 委任式存取设定;14, SELinux 的运做中,重点在于主体进程 (Subject) 可否存取目标文件资源 (Object) ,这中间牵涉到政策(Policy) 内的规则, 以及实际的安全性本文类别 (type);15,安全性本文的通常设定为:『Identify:role:type』其中又以 type 最重要;16,SELinux 的模式有: enforcing, permissive, disabled 三种,而启动的政策 (Policy) 主要是 targeted17,SELinux 启动与关闭的配置文件在: /etc/selinux/config18,SELinux 的启动与观察: getenforce, sestatus 等指令19,重设 SELinux 的安全性本文可以使用 restorecon 与 chcon20,在 SELinux 有启动时,必备的服务至少要启动 auditd 这个!21,若要管理预设的 SELinux 布尔值,可以使用 getsebool, setsebool 来管理