目录
1.什么是进程(Process)?
1.1.什么是程序?
1.2.进程与程序的区别与联系
1.3.Linux是多人、多任务环境
2.工作管理 (job control)
2.1.jobs命令
3.程序的观察
4.程序的管理
4.1.kill -signal PID
4.2.killall -signal 指令名称
4.3.进程的执行顺序
Priority与 Nice 值
4.4.系统资源的观察
在 Linux 系统当中:『触发任何一个事件时,系统都会将他定义成为一个程序,并且给这个程序一个 ID ,称为 PID,同时依据启动这个程序的用户与相关属性关系,给予这个 PID 一组有效的权限设定。 以后,这个 PID 能够在系统上面进行的动作,就与这个 PID 的权限有关了。
在 Linux 底下执行一个指令时,系统会将相关癿权限、属性、程序代码与数据等均加载内存, 并给这个单元一个程序标识符 (PID),最终该指令可以进行的任务则与这个 PID 的权限有关。
在同一时间内,可以有多个用户同时登陆一个系统。
同时可以执行多个进程,比如同时打开qq和音乐播放器。
工作管理 (job control) 是用在 bash 环境下的,当我们登入系统取得 bash shell 之后,在单一终端机接口下同时进行多个工作的行为管理 。举例来说,我们在登入 bash 后, 想要一边复制档案、一边进行资料搜寻、一边进行编译,还可以一边进行 vi 程序撰写! 当然我们可以重复登入那六个文字接口的终端机环境中,不过,能不能在一个 bash 内达成? 当然可以啊!就是使用 job
control。
CTRL + C | 终止一个程序的运行 |
CTRL + Z | 暂停一个程序的运行,并把它放在后台 |
jobs | 查看后台程序已经运行状态 |
bg | 让后台暂停的程序,变成运行状态,例子:运行暂停态序号为1的程序,使用命令:bg 1 |
fg | 将背景工作拿到前景来处理 |
指令 & | 直接将指令丢到背景中『执行』 |
kill | 管理背景当中的工作 |
ps aux | 观察系统所有的程序数据 |
例子:
当我们在终端中打开一个软件,例如:firefox(火狐浏览器)
这时候我们再使用命令的时候,终端就不会响应了,因为此时前台已经firefox浏览器被占用了。
此时使用命令:CTRL + C ,终止这个firefox程序的运行,前台又可以使用了。
再次运行firefox程序,然后使用CTRL+Z,暂停这个程序的运行,前台仍然可以保留出来,但是firefox软件在后台就停止运行了,除了暂停的状态。
firefox程序无响应
命令: jobs
语法:jobs [-lrs]
选项参数
选项 | 含义 |
-l | 除了列出job number 与指令串之外,同时列出PID号码 |
-r | 仅列出正在后台run的工作 |
-s | 仅列出正在后台中停止(stop)的工作。 |
查看后台的程序有哪些,以及程序的状态,使用命令:jobs
解释:此处显示只有一个暂停的程序,名为firefox,序列号为1
如何激活后台停止的程序,使用命令:bg + 暂停态序列号
例如:启动一个序列号为1的程序,使用jobs命令可以看到后台的firefox程序已经处于运行态了:
现在firefox是运行在后台的,如何把它调到前台来呢,使用明明:fg + 序列号
2.2.运行一个程序的时候直接放在后台运行
在运行这个程序的时候直直接在其后面加一个“&”符号,例如,让firefox软件运行在后台,使用命令:firefox &
解释:此时前台的程序可以正常运行,后台的firefox程序也在运行
2.3.管理背景当中的工作: kill
命令:kill
语法:kill -signal %jobnumber
选项:
选项 | 含义 |
-l | 列出目前 kill能够使用的讯号(signal)有哪些 signal:代表给予后面接的那个工作什么样的指示,使用命令man 7 signal 可查询 |
-1 | 重新读取一次参数的配置文件 |
-2 | 代表由键盘输入ctrl -c 同样的工作 |
-9 | 立刻强制删除一个动作 |
-15 | 以正常的程序方式终止一项工作,不同于-9 |
例子:杀掉后台jobnumber为1的那个程序。
使用命令:kill -9 %1
注意:如果上面的命令没有了这个符号"%",就代表是杀死进程PID为1的那个进程,而不是程序。
注意事项:
即使让一个程序在后台运行,但是如果后台有数据输出,这个数据还是显示在前台的屏幕上的,例子演示一下
使用命令:ping localhost & ,使这个命令在后台输出
3.1.ps 命令
功能:将某个时间点的程序运作情況截取下来
选项与参数
参数 | 含义 |
-A | 所有的process均显示出来,与-e相同的效果 |
-a | 不与terminal有关的所有process |
-u | 有效使用者(effective user)相关的peocess |
-x | 通常与a这个参数一起使用,可列出较完整的信息 |
输出格式规划: | |
l | 较长、较详细的将该PID的信息列出 |
j | 工作的格式(jobs format) |
-f | 做一个更为完整的输出 |
例子:
ps aux:观察系统所有的程序数据
ps -lA :能够观察所有系统的数据
ps axjf:连同部分程序树状态
3.2.仅观察自己的 bash 相关程序: ps -l
各段的含义:
o 若为 4 表示此程序的权限为 root ;
o 若为 1 则表示此子程序仅进行复制(fork)而没有实际执行(exec)。
o R (Running):该程序正在运作中;
o S (Sleep):开程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
o D :不可被唤醒的睡眠状忞,通常这支程序可能在等待 I/O 的情况(ex>打印)
o T :停止状忞(stop),可能是在工作控制(背景暂停)或除错 (traced) 状忞;
o Z (Zombie):僵尸状忞,程序已经终止但即无法被移除至内存外。
解释:bash程序
bash 的程序属于 UID 为 0 的使用者,状态为睡眠(sleep), 所以为睡眠状态因为触发了 ps (状态为 run) 。此程序的 PID 为 15142,优先执行顸序为 80, 下达 bash 所取得的终端接口为 pts/0 ,运作状态为等待 (wait) 。
3.3.观察系统所有程序: ps aux
使用命令:ps aux
各段的含义:
一般来说,ps aux命令的显示结果会按照PID的大小来显示,还是找到PID为15412哪个PID来解释一下那段数据的含义:
占用了0.5%的物理内存百分比,状态为休眠(Ss),程序的启动时间为20:58,且取得终端机环境pts/0.
3.4.脱机管理问题:nohup
要注意癿是,我们在工作管理当中提到的『背景』指的是在终端机模式下可以避克 [crtl]-c 中断的一个情境, 并不是放到系统的背景去!所以,工作管理的背景依旧与终端机有关! 在这样的情况冴下,如果你是以进程联机方式连接到你的 Linux 主机,并且将工作以 & 的方式放到背景去, 请问,在工作尚未结束的情况下你脱机了,该工作还会继续进行吗?答案是『否』!不会继续进行,而是会被中断掉。
以尝试使用 nohup 这个指令来处理喔!这个 nohup 可以使你在脱机或注销系统后,还能够使工作继续进行。
语法:
nohup [指令与参数] <==在终端机前景中工作
nohup [指令与参数] & <==在终端机背景中工作
功能:即使你关闭运行程序的控制台,这个程序仍然会运行。
3.5.动态观察程序的变化:top
相对于 ps 是撷取一个时间点的程序状态, top 则可以持续侦测程序运作的状忞!使用方式如下:
语法:
top [-d 数字] | top [-bnp]
参数
指令 | 含义 |
-d | 后面可以接秒数,就是整个程序画面更新的秒数,预设是5s |
-b | 以批次的方式执行top,通常会搭配数据流重导向来将批次结果输出称为档案 |
-n | 与 -b,意义是,需要进行几次top输出结果 |
-p | 指定某个PID来进行观察检测而已 |
在 top 执行过程当中可以使用的按键指令:
- ? :显示在 top 当中可以输入的按键指令;
- P :以 CPU 的使用资源排序显示;
- M :以 Memory 的使用资源排序显示;
- N :以 PID 来排序!
- T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。
- k :给予某个 PID 一个讯号 (signal)
- r :给予某个 PID 重新制订一个 nice 值。
- q :离开 top 软件的按键。
使用top命令可以实时查看进程的变化,默认是5s变化一次:
改变刷新的时间为1s
使用命令:top -d 1
现在刷新速度是1s一次。
程序之间是可以互相控制的!举例来说,你可以关闭、重新启动服务器软件,朋务器软件本身是个程序, 你既然可以使它关闭或启动,当然就是可以控制该程序啦!那么程序是如何互相管理的呢?其实是透过给予该程序一个讯号 (signal) 去告知该程序你想要它做什么!
例子:杀死ping这个进程,例如这个进程的PID是15423
使用命令:kill -9 15423
如何查看一个进程或指令的PID?
使用命令:pidof 指令
例如查看ping的pid,使用命令:pidof ping
由于 kill 后面必项要加上 PID 或者是( job number),所以,通常 kill 都会配合 ps, pstree 指令挃令,因为我们必项要找到相对应的那个程序的 ID 嘛!但是,如此一来,很麻烦~有没有可以利用『下达指令的名称』来给予这个信号的。
那么就是这条指令啦:killall -signal 指令名称
语法:
killall [-iIe] [command name]
选项
选项 | 含义 |
-i | interactive 的意忠,交互式的,若需要删除时,会出现提示字符给用户 |
-e | exact 的意思,表示『后面接的 command name 要一致』,但整个完整的指令不能超过 15 个字符 |
-I | 指令名称(可能含参数)忽略大小写 |
例子:杀死ping这个进程
使用命令:killall -9 ping
我们知道 Linux 是多人多任务的环境,由 top 的输出结果我们也发现, 系统同时间有非常多的程序在运行中,叧是绝大部分的程序都在休眠 (sleeping) 状态而已。 想一想,如果所有的程序同时被唤醒,那么 CPU 应该要先处理那个程序呢?
由于 PRI 是核心动态调整的,我们用户也无权去干涉 PRI !那如果你想要调整程序的优先执行序时,就得要透过 Nice 值了!Nice 值就是上表的 NI 啦!一般来说, PRI 与 NI 的相关性如下:
注意:如果原本的 PRI 是 50 ,并不是我们给予一个 nice = 5 ,就会使 PRI 变成 55! 因为 PRI 是系统『动态』决定的,所以,虽然 nice 值是可以影响 PRI ,不过, 最终的 PRI 仍是要经过系统分析后才会决定的。另外, nice 值是有正负的喔,而既然 PRI 越小越早被执行, 所以,当nice 值为负值时,那么该程序就会降低 PRI 值,这个进程的优先级就越高。
- nice 值可调整的范围为 -20 ~ 19 ;
- root 可随意调整自己或他人程序的 Nice 值,其范围为 -20 ~ 19 ;
- 一般用户仅可调整自己程序的 Nice 值,其范围仅为 0 ~ 19 (避免一般用户抢占系统资源);
- 一般使用者仅可将 nice 值越调越高,例如本来 nice 为 5 ,则未来仅能调整到大于 5
语法:
nice [-n 数字] command
选项:
-n :后面接一个数值,数值癿范围 -20 ~ 19
例子:
用 root 给一个 nice 植为 -5 ,用于执行 vi ,并观察该程序!
语法:
renice [number] PID
选项:PID :某个程序的 ID
例子:
找出自己的 bash PID ,并将该 PID 的 nice 调整到 10
同样可以使用top命令里面使用指令去修改。
语法:
free [-b|-k|-m|-g] [-t]
选项与参数
选项 | 含义 |
-b | 直接输入 free 时,显示的单位是 Kbytes,我们可以使b(bytes),m(Mbytes)、k(Kbytes), 及 g(Gbytes) 来显示单位! |
-t | 在输出的最终结果,显示物理内存与 swap 的总量 |
l
例子:
语法
uname [-asrmpi]
选项与参数
选项 | 参数 |
-a | 所有系统相关的信息,包括底下的数据都会被列出来; |
-s | 系统核心名称 |
-r | 核心的版本 |
-m | 本系统的硬件名称,例如 i686 或者 x86_64 等; |
-p | CPU 的类型,与 -m 类似,叧是显示的是 CPU的类型! |
-i | 硬件的平台 (ix86) |
例子:
使用命令:uname -a
例子:
使用命令:uptime