一.什么是进程(process)
1)进程与程序
触发任何一个事件时,系统都会将它定义为一个进程,并且给这个进程一个ID,称为PID。
程序:一般是放置在物理磁盘或其他存储媒介中(以物理文件的形式存在),然后通过用户的执行来触发。触发后加载到内存中成为一个个体,就是进程。(内存中的数据都是写入到/proc/*这个目录下)
进程:程序被触发后,执行者的权限与属性、程序的代码与所需数据等都会被加载到内存中,操作系统给予这个内存中的单元一个标识符(PID),可以说进程是一个正在运行中的程序。
之前说过的衍生出来的进程,在bash环境下执行命令而触发的进程为子进程,原bash的进程为父进程,父进程的ID为PPID(Parent PID)
fork and exec:程序调用的流程
进程都会借由父进程以复制(fork)的方式产生一个一模一样的子进程,然后被复制出来的子进程再以exec的方式来执行实际要执行的进程。
这里产生的临时进程的程序名为zzz,其PPID和PID都与实际的子进程的PPID和PID相同。
系统或网络服务
常驻在内存中的进程被称为服务(daemon)。
例如计划任务的命令为cron与at,它们的服务名称为crond与atd。
一般daemon类型的进程都会在文件名后加d来简便地判断该进程是否为daemon。
2)Linux多人多任务环境
不同的bash登录有不同的PID
默认提供7个基本终端界面,6个命令行登录界面和一个图像界面
在Ubuntu中使用ctrl+alt+F1~F7来切换不同的登录界面。
当某个进程死掉,终端卡死的时候,可以切换到另一个登录界面,将刚刚卡死的进程kill掉。从而使计算机恢复正常而不用重新启动。
bash环境下的任务管理,可以使用&符号,将命令放在后台执行
二.任务管理(job control)
就是指当我们登录系统获取到bash shell之后,在单一终端下同时执行多个任务的操作管理。
1)什么是任务管理
执行任务管理的时候,每个任务都是当前bash的子进程,彼此之间有相关性,无法使用任务管理的方式由tty1的环境去管理tty2的bash。
/etc/secrutiy/limits.conf里面可以设置用户同时登录的连接数,因此某些用户可能只能启动一个连接来进行工作,所以学习任务管理是必要的。
可以出现提示字符让你操作的环境称为前台(foreground);其他任务放入后台(background)运行或者暂停,后台的任务必须不能够与用户进行交互。放入后台的任务是不可以使用ctrl+c来终止的。
2)job control的管理
在后台里面的任务状态可以分为暂停stop和运行running。
将命令放在后台执行的&
在命令的最后加&符号,可以将命令放在后台执行。同时会给予该命令一个任务号码(job number)
这里还用到了数据流重定向,将正确信息和错误信息发送到/tmp/log.txt
将目前的任务丢到后台中暂停:ctrl+z
在暂停的时候一样会显示出任务号码
jobs查看目前的后台任务状态:jobs
jobs -lrs
-l:除了列出job number与命令串之外,同时列出PID的号码。
-r:仅列出在后台run的任务
-s:仅列出在后台stop的任务
同时暂停两个任务,在任务号码旁边显示+号的表示时最近被放到后台的任务,-表示是最近第二个被放到后台的任务号码。
将后台任务拿到前台来处理:fg
fg %jobnumber
这里的%可有可无
这里指定拿任务号码的任务到前台;若没有指定任务号码,则默认拿+的号码。
让任务在后台下的状态变成运行中:bg
bg %jobnumber
管理后台的任务:kill
kill -l 显示目前kill能够使用的信号
kill -signal %jobnumber
这里的不同siganl代表对某个任务不同的操作
-signal:-1表示重新读取一次参数的配置文件 -SIGHUP;-2表示由键盘输入ctrl+c同样的操作;-9表示强制删除一个任务 -SIGKILL;-15表示以正常的方式终止任务与-9时不同的 -SIGTERM;
需要注意使用kill对vi任务进行删除的时候,若使用-9会产生一个.filename.swp的文件,若使用-15结束任务,则不会有该文件产生。
3)脱机管理问题
任务管理的后台依旧与终端有关。但是at的任务放置到后台与终端无关。
使用nohup命令进行处理,可以在脱机或注销系统后让任务继续执行。
nohup 命令与参数
nohup 命令与参数 &
nohup不支持bash内置的命令,命令必须是外部的命令。
三.进程管理
1)查看进程
ps:将某个时间结点的进程运行情况显示出来
-A:所有进程都显示出来,与-e效果相同。
-a:不显示与终端有关的所有进程
-u:有效使用者的相关进程
输出格式规划:
-l:较长、较详细的将PID的信息列出
-j:任务的格式
-f:做一个更为完整的输出
ps -l只查看自己bash相关的进程
ps aux查看系统的所有进程
top:动态查看进程的变换
top [-d 数字] -bnp
-d:后面加秒数,就是整个进程界面更新的秒数,默认5秒
-b:以批量的方式执行top,通常会搭配数据流重定向来将结果输出为文件
-n:与-b搭配,意义是,需要执行几次top的输出结果
-p:指定某些个PID来执行查看监测。
top执行过程中,在top界面可以使用的按键命令:
?:显示在top中可以输入的按键命令
P:以CPU的使用排序显示
M:以Memory的使用排序显示
N:以PID来排序
T:由该进程使用的CPU时间累积排序
k:给予某一个PID一个信号
r:给予某个PID重新编制一个nice值
q:退出top按键
#每2秒刷新一次,将两次结果输出到/tmp/top.txt中
top -d 2 -b -n 2 > /tmp/top.txt
#查看bash PID,由$$变量获取
echo $$
#得到3132
#查看指定进程
top -d 2 -p 3132
在top界面按下r可以修改进程的NICE值
NI越小越优先被执行,从小改大打可以不需要root权限,但是没有root权限不能从大改到小。
pstree:显示所有进程以及它们之间的相关性
pstree [-A|U] [-up]
-A:各个进程之间的连接以ASCII字符来连接
-U: 以Unicode的字符来连接,在某些终端界面下可能会出现错误。
-p:同时列出每个进程的PID
-u:同时列出每个进程的所属账号名称
使用pstree可以很方便地找出进程之间的相关性。
在pstree的输出结果中我们可以看到systemd这个进程的PID是1,是Linux内核调用的第一个进程。
2)进程的管理
常用信号signal
kill -signal PID将进程关闭
需要注意kill可以将信号传递给任务或者某个进程。传递给任务是kill -signal %number,传递给进程是直接加数字kill -signal number
killall -signal 命令名称
killall [iIe] -signal 命令名称
-i:interactive若需要删除时,会出现提示字符给使用者
-e:exact,表示后面接的command name要一致,但整个完整的命令不能超过15个字符。
-I:命令名称忽略大小写。(这是i的大写不是L的小写)
3)进程的执行顺序
Priority与Nice值
系统会给予进程一个PRI值,PRI越小,越优先。
注意:PRI的值时有内核动态分配的,用户无法直接调整PRI值。用户若要调整进程的优先级就要通过nice值。
PRI(new)=PRI(old)+nice
nice为负值的时候,就会降低PRI值,就会被优先执行。
nice 值可调整的范围为 -20 ~ 19 ;
root 可随意调整自己或他人进程的 Nice 值,且范围为 -20 ~ 19 ;
一般使用者仅可调整自己进程的 Nice 值,且范围仅为 0 ~ 19 (避免一般用户抢占系统资源);
一般使用者仅可将 nice 值越调越高,例如本来 nice 为 5 ,则未来仅能调整到大于 5;
调整nice值
调整进程的nice值,就是调整进程的优先级。两种方法:
i)一开始执行进程的时候就立即给予一个特定的nice值:用nice命令;
ii)调整某个已经存在的PID的nice值:用renice命令。
nice:
nice [-n 数字] command
-n后面接数字,范围为-20~19
通常会将一些在后台运行的不重要的进程的优先级减小,将nice值增大。如备份命令。
renice
renice number PID
注:nice值会被继承。比如:修改bash的nice值,bash触发的子进程ps的nice值与bash的值相同。
4)查看系统资源信息
free:查看内存使用情况
uname:查看系统与内核相关信息
uptime:查看系统启动时间与任务负载
netstat:追踪网络或socket文件
dmesg:分析内核产生的信息
vmstat:检测系统资源变化
四.特殊文件与进程
1)具有SUID/SGID权限的命令执行状态
SUID的特点:
SUID权限仅对二进制程序有效
执行者对于该程序需要具有x的可执行权限
本权限仅在执行该程序的过程中有效
执行者将具有该程序拥有者的权限
整个SUID的权限生效是由于具有该权限的程序被触发,例如passwd执行后具有root权限,是因为执行passwd之后会触发一个新的进程与PID,该PID产生的时候会通过SUID来进行特殊的权限设置。
查找权限为
2)/proc/*代表的意义
进程都是在内存中,而内存当中的数据都写入/proc/*这个目录下
3)查询已使用文件或已执行进程使用的文件
lsof
默认是将系统上所有已经打开的文件都列出来
在非root权限下,是看不到命令的执行路径的。
在root权限下,可以看到systemd执行的地方是根目录