进程
- 触发任何一个事件时,系统都会将它定义成为一个进程,并且给与这个进程一个ID,称为PID,同时依据触发这个进程的用户与相关属性关系,给与这个PID一组有效的权限设置。
- 进程有给与执行者的权限/属性等参数,并包括进程所需要的脚本与数据或文件数据等,最后再给与一个PID,系统就是通过这个PID来判断该process是否具有权限进行工作的。
- 由父进程衍生出来的其他进程在一般状态下,也会沿用这个进程的相关权限。
- 程序:通常为二进制程序放置在存储媒介中,以物理文件的形式存在
进程:程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载到内存中,操作系统并给予这个内存内的单元一个标识符(PID),进程就是一个正在运行中的程序。
- 某个进程的父进程可以通过Parent PID(PPID)来判断。进程都会通过父进程以复制(fork)方式产生一个一模一样的子进程,然后被复制出来的子进程再以exec的方式执行实际要进行的进程,最终成为一个子进程的存在。
- 常驻进程被称为服务(daemon),使用
&
符号可以让某个命令放置于后台执行。
工作管理
- bash环境下工作管理是当我们登陆系统取得bash shell之后,在单一终端机下同时进行多个工作的行为管理。在进行工作管理的行为中,其实每个工作都是都是目前bash的子进程,即彼此之间是有相关性的,我们无法以job control的方式由tty1的环境去管理tty2的bash。
- 要进行bash的job control必须要注意的限制是:
(1)这些工作所触发的进程必须来自于我们shell的子进程(只管理自己的bash)
(2)前台:我们可以控制与执行命令的这个环境称为前台的工作
(3)可以自行运行的工作,我们无法使用ctrl+c终止它,可使用bg/fg调用该工作
(4)后台中“执行”的进程不能等待terminate/shell的输入
&
命令可以直接将命令丢到后台中“执行”,但是如果执行过程中出现错误信息,则会输出到前台影响前台,因此我们可以使用数据流重定向将输出信息输出到某个文件中。
- 工作号码(job number)只与bash环境有关,但是它是由命令触发因此也会搭配一个PID。
ctrl+z
可以将目前的工作丢到后台中“暂停”,+
代表最近一个被丢进后台的工作,且目前在后台下默认会被取用的那个工作(与fg
命令有关),而stopped
则代表目前这个工作的状态,在默认情况下使用ctrl+z
丢到后台当中的工作都是“暂停”的状态
jobs
命令可以查看目前的后台工作状态,+
代表默认的取用工作,如果我们仅输入fg
,那么[2]所代表的的工作会被拿到前台当中处理,-
代表最近最后第二个被放置到后台中的工作号码,而当超过最后三个以后的工作时就没有+-
符号了。
jobs [-lrs]
-l
:除了列出job number与命令串以外,同时列出PID的号码
-r
:仅列出正在后台run的工作
-s
:仅列出正在后台暂停的工作
fg
命令可以将后台工作拿到前台来处理
fg %jobnumber
:jobnumber为工作号码,%是可有可无的,如果不加jobnumber默认为最近的一个工作
bg
命令可以让工作在后台下的状态变成运行中,kill
命令可以管理后台当中的工作。
kill -l
:列出目前kill
能够使用的信号有哪些
kill -signal %jobnumber
-1
:重新读取一次参数的配置文件
-2
:代表与由键盘输入ctrl+c
同样的操作
-9
:立即强制删除一个工作
-15
:以正常的程序方式终止一项工作,与-9不一样
-9
通常是在强制删除一个不正常的工作时使用的,-15
则是以正常步骤结束一项工作(15是默认值)
kill
后面接的数字默认是PID,如果想要管理bash的工作控制就要加上%数字了。如果想要进行脱机管理,我们可以使用nohup [命令与参数]
让工作在终端机前台工作,也可以使用nohup [命令与参数] &
让工作在终端机后台工作。
进程管理
ps
命令可以将某个时间点的进程运行情况选取下来,ps -l
仅查看自己的bash相关进程,ps aux
命令可以查看系统所有进程
top
命令可以动态查看进程的变化,不同于ps
是静态的结果输出,top
这个程序可以持续监测整个系统的进程工作状态,top
命令默认使用CPU使用率作为排序的重点,我们可以使用各种按键命令来进行各种不同的排序,也可以使用-p
参数来查看特定的进程
pstree
命令可以查看进程相关性,所有的进程都是依附在init这个进程下面的,init进程的PID是1,因为它是由Linux内核主动调用的第一个进程。
- 程序管理是通过给予该进程一个信号去告知该进程你想要让它做什么,我们可以使用
kill
和killall
命令,killall
命令可以通过命令名称来控制相应命令所产生的进程
kill -signal PID
killall -signal 命令名称
-1
:启动被终止的进程
-9
:强制中断一个进程的执行
-15
:以正常的结束进程来终止该进程
PRI
值越低代表越优先的意思,不过PRI
值是由内核动态调整的,用户无法直接调整PRI
值,如果我们想要调整进程的优先级时,我们可以通过调整Nice
值,当nice值为负值时,该程序就会降低PRI
值,即会变得较优先处理,nice值可调整范围为-20~19,为避免一般用户抢占系统资源,一般用户仅可将nice值越调越高
nice
命令可以给与新执行的命令新的nice值,nice [-n 数字] command
,renice
命令可以重新调整已存在进程的nice值,renice [number] PID
free
命令可以查看内存使用情况,uname
命令可以查看系统与内核相关的信息,uptime
命令可以查看系统启动时间与工作负载,netstat
命令可以跟踪网络,dmesg
命令分析内核产生的信息,vmstat
命令检测系统资源变化
特殊文件与程序
- 具有SUID/SGID权限的命令执行状态:
(1)SUID仅对二进制程序有效
(2)执行者对于该程序需要有x的可执行权限
(3)本权限仅在执行该程序的过程中有效
(4)执行者将具有该程序所有者的权限
- 进程存于内存中,内存数据存于/proc/*目录下,我们可以直接查看/proc这个目录下的文件,
cmdline
文件里是这个进程被启动的命令串,而environ
文件里是这个进程的环境变量内容
- 查询已打开文件或已执行程序打开的文件:
fuser
命令可以通过文件(或文件系统)找出正在使用该文件的程序
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