(整理自《鸟哥的Linux私房菜》基础篇)
1.程序和进程
- 程序 (program):通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体文件的型态存在;
- 进程 (process):程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载内存中, 操作系统并给予这个内存内的单元一个标识符 (PID),可以说,进程就是一个正在运作中的程序。
2.父进程与子进程
当我们登入系统后,会取得一个 bash 的 shell ,然后,我们用这个 bash 提供的接口去执行另一个指令,例如 /usr/bin/passwd 或者是 touch 等,那些另外执行的指令也会被触发成为 PID ,那个后来执行指令才产生的 PID 就是子进程,而在我们原本的 bash 环境下,就称为父进程。
在 Linux 的进程调用通常称为 fork-and-exec 的流程 !进程都会藉由父进程以复制 (fork) 的方式产生一个一模一样的子进程, 然后被复制出来的子进程再以 exec 的方式来执行实际要进行的程序,最终就成为一个子进程的存在。 整个流程有点像底下这张图:
(1)系统先以 fork 的方式复制一个与父进程相同的暂存进程,这个进程与父进程唯一的差别就是 PID 不同! 但是这个暂存进程还会多一个 PPID 的参数,PPID 如前所述,就是父进程的进程标识符!然后
(2)暂存进程开始以 exec 的方式加载实际要执行的程序,以上述图标来讲,新的程序名称为 qqq ,最终子进程的程序代码就会变成 qqq 了 。
守护进程:
常驻在内存当中的进程通常都是负责一些系统所提供的功能以服务用户各项任务,因此这些常驻程序就会被我们称为:服务或者守护进程(daemon)。
3.任务管理
3.1 什么是任务管理
进行工作管理的行为中, 其实每个工作都是目前 bash 的子进程,亦即彼此之间是有相关性的。 我们无法以任务管理的方式由 tty1 的环境去管理 tty2 的 bash。
要进行 bash 的任务管理必须要注意到的限制是:
• 这些工作所触发的进程必须来自于你 shell 的子进程(只管理自己的 bash);
• 前景:你可以控制与下达指令的这个环境称为前景的工作 (foreground);
• 背景:可以自行运作的工作,你无法使用 [ctrl]+c 终止他,可使用 bg/fg 呼叫该工作;
背景中『执行』的进程不能等待 terminal/shell 的输入(input)。
3.2 job control 的管理
§ 直接将指令丢到背景中『执行』的 &
举个简单的例子,我们要将 /etc/ 整个备份成为 /tmp/etc.tar.gz 且不想要等待,那么可以这样做:
如果你输入几个指令后,突然出现这个数据:
就代表 [1] 这个工作已经完成 (Done) ,该工作的指令则是接在后面那一串指令列。
这样的情况最大的好处是: 不怕被 [ctrl]+c 中断。
此外,将工作丢到背景当中要特别注意资料的流向!包括上面的讯息就有出现错误息,导致我的前景被影响。 虽然只要按下 [enter] 就会出现提示字符。但如果我将刚刚那个指令改成:
情况会怎样?在背景当中执行的指令,如果有 stdout 及 stderr 时,他的数据依旧是输出到屏幕上面的, 所以,我们会无法看到提示字符,当然也就无法完好的掌握前景工作。同时由于是背景工作的 tar ,此时你怎么按下 [ctrl]+c 也无法停止屏幕被搞的花花绿绿的。所以,最佳的状况就是利用数据流重导向, 将输出数据传送至某个文件中。举例来说,我可以这样做:
如此一来,输出的信息都给他传送到 /tmp/log.txt 当中,当然就不会影响到我们前景的作业了。
§ 将『目前』的工作丢到背景中『暂停』:[ctrl]-z
想个情况:如果我正在使用 vim ,却发现我有个文件不知道放在哪里,需要到 bash 环境下进行搜寻,此时是否要结束 vim 呢?当然不需要
在 vim 的一般模式下,按下 [ctrl] 及 z 这两个按键,屏幕上会出现 [1] ,表示这是第一个工作, 而那个 + 代表最近一个被丢进背景的工作,且目前在背景下预设会被取用的那个工作 (与 fg 这个指令有关 )!而那个 Stopped 则代表目前这个工作的状态。在预设的情况下,使用 [ctrl]-z 丢到背景当中的工作都是『暂停』的状态。
§ 观察目前的背景工作状态: jobs
在输出的信息当中,仔细看到那个 + - 号! + 代表预设的取用工作。 所以说目前我有两个工作在背景当中,两个工作都是暂停的, 而如果我仅输入 fg 时,那么那个 [2] 会被拿到前景当中来处理!
其实 + 代表最近被放到背景的工作号码, - 代表最近最后第二个被放置到背景中的工作号码。 而超过最后第三个以后的工作,就不会有 +/- 符号存在了。
§ 将背景工作拿到前景来处理:fg
举例来说,我们想要将上头范例当中的工作拿出来处理时:
§ 让工作在背景下的状态变成运作中: bg
如何让一个Stop的工作在背景底下 Run 呢?
§ 管理背景当中的工作: kill
如果想要将该工作直接移除呢?或者是将该工作重新启动呢?这个时候就得需要给予该工作一个信号 (signal) ,让他知道该怎么作。
特别留意一下, -9 这个 signal 通常是用在强制删除一个不正常的工作时所使用的, -15 则是以正常步骤结束一项工作(15 也是默认值),两者之间并不相同!举上面的例子来说, 我用 vim 的时候,会产生一个 .filename.swp 的文件, 那么,当使用 -15 这个 signal 时, vim 会尝试以正常的步骤来结束掉该 vi 的工作, 所以 .filename.swp 会主动的被移除。但若是使用 -9 这个signal 时,由于该 vim 工作会被强制移除掉,因此,.filename.swp 就会继续存在文件系统当中。
3.3脱机管理问题
nohup 命令可以让你在脱机或注销系统后,还能够让工作继续进行。语法像这样:
需要注意的是, nohup 并不支持 bash 内建的指令,因此你的指令必须要是外部指令才行。 我们来尝试玩一下底下的任务:
如果你再次登入的话,再使用 pstree 去查阅你的进程,会发现 sleep500.sh 还在执行中。由于我们的程序最后会输出一个讯息,但是 nohup 与终端机其实无关了, 因此这个讯息的输出就会被导向『 ~/nohup.out 』,所以你才会看到上述指令中,当你输入 nohup 后, 会出现那个提示讯息。
4.进程管理
4.1查看进程
§ ps :将某个时间点的进程运作情况撷取下来
一个是只能查阅自己 bash 进程的『 ps -l 』一个则是可以查阅所有系统运作的进程『 ps aux 』
仅观察自己的 bash 相关进程: ps -l
我们来观察看看:
§ F:代表这个进程旗标 (process flags),说明这个进程的总结权限,常见号码有:
§ 若为 4 表示此进程的权限为 root ;
§ 若为 1 则表示此子进程仅进行复制(fork)而没有实际执行(exec)。
§ S:代表这个进程的状态 (STAT),主要的状态有:
§ R (Running):该程序正在运作中;
§ S (Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒(signal)。
§ D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 的情况(ex>打印)
§ T :停止状态(stop),可能是在工作控制(背景暂停)或除错 (traced) 状态;
§ Z (Zombie):僵尸状态,进程已经终止但却无法被移除至内存外。
§ UID/PID/PPID:代表『此进程被该 UID 所拥有/进程的 PID 号码/此进程的父进程 PID 号码』
§ C:代表 CPU 使用率,单位为百分比;
§ PRI/NI:Priority/Nice 的缩写,代表此进程被 CPU 所执行的优先级,数值越小代表该进程越快被 CPU 执行。
§ ADDR/SZ/WCHAN:都与内存有关,ADDR 是 kernel function,指出该进程在内存的哪个部分,如果是个 running 的进程,一般就会显示『 - 』 / SZ 代表此进程用掉多少内存 / WCHAN 表示目前进程是否运作中,同样的, 若为 - 表示正在运作中。
§ TTY:登入者的终端机位置,若为远程登录则使用动态终端接口 (pts/n);
§ TIME:使用掉的 CPU 时间,注意,是此进程实际花费 CPU 运作的时间,而不是系统时间;
§ CMD:就是 command 的缩写,造成此进程的触发程序之指令为何。
所以你看到的 ps -l 输出讯息中,他说明的是:『bash 的程序属于 UID 为 0 的使用者,状态为睡眠 (sleep), 之所以为睡眠因为他触发了 ps (状态为 run) 之故。此进程的 PID 为 14836,优先执行顺序为 80 , 下达 bash 所取得的终端接口为 pts/0 ,运作状态为等待 (wait)。
o 观察系统所有进程: ps aux:
在 ps aux 显示的项目中,各字段的意义为:
§ USER:该 process 属于那个使用者账号的?
§ PID :该 process 的进程标识符。
§ %CPU:该 process 使用掉的 CPU 资源百分比;
§ %MEM:该 process 所占用的物理内存百分比;
§ VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
§ RSS :该 process 占用的固定的内存量 (Kbytes)
§ TTY :该 process 是在那个终端机上面运作,若与终端机无关则显示 ?,另外, tty1-tty6 是本机上面的登入者进程,若为 pts/0 等等的,则表示为由网络连接进主机的进程。
§ STAT:该进程目前的状态,状态显示与 ps -l 的 S 旗标相同 (R/S/T/Z)
§ START:该 process 被触发启动的时间;
§ TIME :该 process 实际使用 CPU 运作的时间。
§ COMMAND:该进程的实际指令为何。
一般来说,ps aux 会依照 PID 的顺序来排序显示,我们还是以 14836 那个 PID 那行来说明。该行的意义为root 执行的 bash PID 为 14836,占用了 0.1% 的内存容量百分比,状态为休眠 (S),该进程启动的时间为 8 月 4 号,因此启动太久了, 所以没有列出实际的时间点。且取得的终端机环境为 pts/1。
如果你发现在某个进程的 CMD 后面还接上 <defunct> 时,就代表该进程是僵尸进程啦,例如:
top:动态观察进程的变化
接下来让我们实际观察一下如何使用 top 与 top 的画面:
top 这个程序可以持续的监测整个系统的进程工作状态。 在预设的情况下,每次更新进程资源的时间为 5 秒,不过,可以使用 -d 来进行修改。
top 主要分为两个画面,上面的画面为整个系统的资源使用状态,基本上总共有六行,显示的内容依序是:
• 第一行(top...):这一行显示的信息分别为:
o 目前的时间,亦即是 00:53:59 那个项目;
o 开机到目前为止所经过的时间,亦即是 up 6:07, 那个项目;
o 已经登入系统的用户人数,亦即是 3 users, 项目;
o 系统在 1, 5, 15 分钟的平均工作负载。 越小代表系统越闲置,若高于 1 得要注意你的系统进程是否太过繁复。
• 第二行(Tasks...):显示的是目前进程的总量与个别进程在什么状态(running, sleeping, stopped, zombie)。 比较需要注意的是最后的 zombie 那个数值。
• 第三行(%Cpus...):显示的是 CPU 的整体负载,每个项目可使用 ? 查阅。需要特别注意的是 wa 项目,那个项目代表的是 I/O wait, 通常你的系统会变慢都是 I/O 产生的问题比较大,因此这里得要注意这个项目耗用 CPU 的资源。 另外,如果是多核心的设备,可以按下数字键『1』来切换成不同 CPU 的负载率。
• 第四行与第五行:表示目前的物理内存与虚拟内存 (Mem/Swap) 的使用情况。要注意的是 swap 的使用量要尽量的少!如果 swap 被用的很大量,表示系统的物理内存实在不足!
• 第六行:这个是当在 top 程序当中输入指令时,显示状态的地方。
至于 top 下半部分的画面,则是每个 process 使用的资源情况。比较需要注意的是:
• PID :每个 process 的 ID ;
• USER:该 process 所属的使用者;
• PR :Priority 的简写,进程的优先执行顺序,越小越早被执行;
• NI :Nice 的简写,与 Priority 有关,也是越小越早被执行;
• %CPU:CPU 的使用率;
• %MEM:内存的使用率;
• TIME+:CPU 使用时间的累加;
top 预设使用 CPU 使用率 (%CPU) 作为排序的重点,如果你想要使用内存使用率排序,则可以按下『M』, 若要回复则按下『P』即可。如果想要离开 top 则按下『 q 』。
4.2进程的管理
通过发送信号的方式:
代 号 |
名称 |
内容 |
1 |
SIGHUP |
启动被终止的进程,可让该 PID 重新读取自己的配置文件,类似重新启动 |
2 |
SIGINT |
相当于用键盘输入 [ctrl]-c 来中断一个进程的进行 |
9 |
SIGKILL |
代表强制中断一个进程的进行,如果该进程进行到一半, 那么尚未完成的部分可能会有『半产品』产生,类似 vim 会有 .filename.swp 保留下来。 |
15 |
SIGTERM |
以正常的结束进程来终止该进程。由于是正常的终止, 所以后续的动作会将他完成。不过,如果该进程已经发生问题,就是无法使用正常的方法终止时, 输入这个 signal 也是没有用的。 |
19 |
SIGSTOP |
相当于用键盘输入 [ctrl]-z 来暂停一个进程的进行 |
更多信号见man 7 signal。
§ kill -signal PID
要注意: kill 后面直接加数字与加上 %number 的情况是不同的。
§ killall -signal 指令名称
4.3关于进程的执行顺序
Priority 与 Nice 值:
PRI 值越低代表越优先的意思。不过这个 PRI 值是由核心动态调整的, 用户无法直接调整 PRI 值的
由于 PRI 是核心动态调整的,我们用户也无权去干涉 PRI !那如果你想要调整进程的优先执行序时,就得要透过 Nice 值了!Nice 值就是上表的 NI, PRI 与 NI 的相关性如下:
PRI(new) = PRI(old) + nice
不过你要特别留意到,如果原本的 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 值呢?有两种方式,分别是:
• 一开始执行程序就立即给予一个特定的 nice 值:用 nice 指令;
• 调整某个已经存在的 PID 的 nice 值:用 renice 指令。
§ nice :新执行的指令即给予新的 nice 值
§ renice :已存在进程的 nice 重新调整
4.4系统资源的观察
free :观察内存使用情况:
§ uname:查阅系统与核心相关信息:
§ uptime:观察系统启动时间与工作负载:
uptime 可以显示出 top 画面的最上面一行
§ netstat :追踪网络或socket文件:
基本上, netstat 的输出分为两大部分,分别是网络与系统自己的进程相关性部分:
在上面的结果当中,显示了两个部分,分别是网络的联机以及 linux 上面的 socket 进程相关性部分。我们先来看看因特网联机情况的部分:
• Proto :网络的封包协议,主要分为 TCP 与 UDP 封包;
• Recv-Q:非由用户程序链接到此 socket 的复制的总 bytes 数;
• Send-Q:非由远程主机传送过来的 acknowledged 总 bytes 数;
• Local Address :本地端的 IP:port 情况
• Foreign Address:远程主机的 IP:port 情况
• State :联机状态,主要有建立(ESTABLISED)及监听(LISTEN);
我们看上面仅有一条联机的数据,他的意义是:透过 TCP 封包的联机,远程的 172.16.220.234:48300 联机到本地端的 172.16.15.100:ssh ,这条联机状态是建立 (ESTABLISHED) 的状态。
上表中 socket file 的输出字段有:
• Proto :一般就是 unix ;
• RefCnt:连接到此 socket 的进程数量;
• Flags :联机的旗标;
• Type :socket 存取的类型。主要有确认联机的 STREAM 与不需确认的 DGRAM 两种;
• State :若为 CONNECTED 表示多个进程之间已经联机建立。
• Path :连接到此 socket 的相关程序的路径!或者是相关数据输出的路径。
以上表的输出为例,最后那三行在 /tmp/.xx 底下的数据,就是 X Window 窗口接口的相关进程!而 PATH 指向的就是这些进程要交换数据的插槽文件!
那么 netstat 可以帮我们进行什么任务呢?我们先来看看,利用 netstat 去看看我们的哪些进程有启动哪些网络的『后门』呢?
§ dmesg :分析核心产生的讯息:
因为讯息实在太多了,所以执行时可以加入这个管线指令『 | more 』。
vmstat :侦测系统资源变化:
vmstat 可以侦测『 CPU / 内存 / 磁盘输入输出状态 』等,如果你想要了解一部繁忙的系统到底是哪个环节最累人, 可以使用 vmstat 分析看看。底下是常见的选项与参数说明:
利用 vmstat 甚至可以进行追踪喔,你可以使用类似『 vmstat 5 』代表每五秒钟更新一次,且无穷的更新,直到你按下 [ctrl]-c 为止。上面的表格各项字段的意义为何? 基本说明如下:
• 进程字段 (procs) 的项目分别为:
r :等待运作中的进程数量;b:不可被唤醒的进程数量。这两个项目越多,代表系统越忙碌 (因为系统太忙,所以很多进程就无法被执行或一直在等待而无法被唤醒之故)。
• 内存字段 (memory) 项目分别为: swpd:虚拟内存被使用的容量; free:未被使用的内存容量; buff:用于缓冲存储器; cache:用于高速缓存。 这部份则与 free命令是相同的。
• 内存置换空间 (swap) 的项目分别为: si:由磁盘中将进程取出的量; so:由于内存不足而将没用到的进程写入到磁盘的 swap 的容量。 如果 si/so 的数值太大,表示内存内的数据常常得在磁盘与主存储器之间传来传去,系统效能会很差!
• 磁盘读写 (io) 的项目分别为: bi:由磁盘读入的区块数量; bo:写入到磁盘去的区块数量。如果这部份的值越高,代表系统的 I/O 非常忙碌!
• 系统 (system) 的项目分别为:in:每秒被中断的进程次数; cs:每秒钟进行的事件切换次数;这两个数值越大,代表系统与接口设备的沟通非常频繁! 这些接口设备当然包括磁盘、网络卡、时间钟等。
• CPU 的项目分别为: us:非核心层的 CPU 使用状态; sy:核心层所使用的 CPU 状态; id:闲置的状态; wa:等待 I/O 所耗费的 CPU 状态; st:被虚拟机 (virtual machine) 所盗用的 CPU 使用状态 (2.6.11 以后才支持)。
让我们再来看看,磁盘的部分该如何观察:
更多更详细的字段查阅一下 man vmstat了解。
来源:https://www.cnblogs.com/ericz2j/p/12045293.html