【鸟哥的linux私房菜-学习笔记】进程管理

一、什么是进程 (process)

在 Linux 系统当中:『触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的使用者与相关属性关系,给予这个 PID 一组有效的权限配置。』

program:通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体文件的型态存在;

process:程序被触发后,运行者的权限与属性、程序的程序码与所需数据等都会被加载内存中, 操作系统并给予这个内存内的单元一个识别码 (PID),可以说,process就是一个正在运行中的program。

1.fork and exec:程序呼叫的流程

在 Linux 的程序呼叫通常称为 fork-and-exec 的流程。程序都会藉由父程序以复制 (fork) 的方式产生一个一模一样的子程序, 然后被复制出来的子程序再以 exec 的方式来运行实际要进行的程序,最终就成为一个子程序的存在。

2.系统或网络服务:常驻在内存的程序

常驻在内存当中的程序通常都是负责一些系统所提供的功能以服务使用者各项任务,因此这些常驻程序就会被我们称为:服务 (daemon)。

二、Linux 的多人多工环境

多人:每个登录者取得一个独立的shell,互不干扰;每个人进入 Linux 的环境配置都可以随著每个人的喜好来配置,因为每个人取得的shell的PID不同。

多工:可以多个工作同时进行,由操作系统进行进程切换~可以将 PC 的性能整个压榨出来。

在 Linux 下以文字界面登陆,如果在屏幕当中显示错误信息后就挂了~动都不能动,该如何是好!? 这个时候那默认的七个窗口就帮上忙啦!你可以随意的再按 [Alt]+[F1]…..[F7] 来切换到其他的终端机界面,然后以 ps -aux 找出刚刚的错误程序,然后给他 kill 一下,哈哈,回到刚刚的终端机界面!

三、工作管理 (job control)

此处的工作管理 (job control) 是用在 bash 环境下的,也就是说:『当我们登陆系统取得 bash shell 之后,在单一终端机界面下同时进行多个工作的行为管理 』。

进行工作管理的行为中, 其实每个工作都是目前 bash 的子程序,亦即彼此之间是有相关性的。 另外,我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的 bash。

要进行 bash 的 job control 必须要注意到的限制:

这些工作所触发的程序必须来自於你 shell 的子程序(只管理自己的 bash);
前景:你可以控制与下达命令的这个环境称为前景的工作 (foreground);
背景:可以自行运行的工作,你无法使用 [ctrl]+c 终止他,可使用 bg/fg 呼叫该工作;
背景中『运行』的程序不能等待 terminal/shell 的输入(input)。

1.job control 的管理

进行 job 控制的命令:

-直接将命令丢到背景中『运行』的 &

[root@www ~]# tar -zpcf /tmp/etc.tar.gz /etc &
[1] 8400  <== [job number] PID 
[root@www ~]# tar: Removing leading `/' from member names 
# 在中括号内的号码为工作号码 (job number),该号码与 bash 的控制有关。
# 后续的 8400 则是这个工作在系统中的 PID。至於后续出现的数据是 tar 运行的数据流,
# 由於我们没有加上数据流重导向,所以会影响画面!不过不会影响前景的操作。

-将『目前』的工作丢到背景中『暂停』:[ctrl]-z

-观察目前的背景工作状态: jobs

[root@www ~]# jobs [-lrs]
选项与参数:
-l  :除了列出 job number 与命令串之外,同时列出 PID 的号码;
-r  :仅列出正在背景 run 的工作;
-s  :仅列出正在背景当中暂停 (stop) 的工作。

-将背景工作拿到前景来处理:fg

[root@www ~]# fg %jobnumber
选项与参数:
%jobnumber :jobnumber 为工作号码(数字)。注意,那个 % 是可有可无的!

-让工作在背景下的状态变成运行中: bg

-管理背景当中的工作: kill

[root@www ~]# kill -signal %jobnumber
[root@www ~]# kill -l
选项与参数:
-l  :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些?
signal :代表给予后面接的那个工作什么样的指示!用 man 7 signal 可知:
-1 :重新读取一次参数的配置档 (类似 reload);
-2 :代表与由键盘输入 [ctrl]-c 同样的动作;
-9 :立刻强制删除一个工作;
-15:以正常的程序方式终止一项工作。与 -9 是不一样的。

**-9 这个 signal 通常是用在『强制删除一个不正常的工作』时所使用的, -15 则是以正常步骤结束一项工作(15也是默认值),两者之间并不相同。

**kill 后面接的数字默认会是 PID ,如果想要管理 bash 的工作控制,就得要加上 %数字

2.离线管理问题

要注意的是,我们在工作管理当中提到的『背景』指的是在终端机模式下可以避免 [crtl]-c 中断的一个情境, 并不是放到系统的背景去。比如我们离线之后,工作就会终止!

这个问题可以用 at 来处理,因为 at 是将工作放置到系统背景, 而与终端机无关。如果不想要使用 at 的话,那你也可以尝试使用 nohup 这个命令来处理,它可以让你在离线或注销系统后,还能够让工作继续进行。

[root@www ~]# nohup [命令与参数]   <==在终端机前景中工作
[root@www ~]# nohup [命令与参数] & <==在终端机背景中工作

上述命令需要注意的是, nohup 并不支持 bash 内建的命令,因此你的命令必须要是外部命令才行。

四、进程管理

1.进程的观察

ps :将某个时间点的程序运行情况撷取下来

[root@www ~]# ps aux  <==观察系统所有的程序数据
[root@www ~]# ps -lA  <==也是能够观察所有系统的数据
[root@www ~]# ps axjf <==连同部分程序树状态
选项与参数:
-A  :所有的 process 均显示出来,与 -e 具有同样的效用;
-a  :不与 terminal 有关的所有 process ;
-u  :有效使用者 (effective user) 相关的 process ;
x   :通常与 a 这个参数一起使用,可列出较完整资讯。
输出格式规划:
l   :较长、较详细的将该 PID 的的资讯列出;
j   :工作的格式 (jobs format)
-f  :做一个更为完整的输出。

-仅观察自己的 bash 相关程序: ps -l

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 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:该程序的实际命令为何。

『僵尸 (zombie) 』程序是什么? 通常,造成僵尸程序是因为该程序应该已经运行完毕,或者是因故应该要终止了, 但是该程序的父程序却无法完整的将该程序结束掉,而造成那个程序一直存在内存当中。 如果你发现在某个程序的 CMD 后面还接上 “defunct” 时,就代表该程序是僵尸程序。

-top:动态观察程序的变化

[root@www ~]# top [-d 数字] | top [-bnp]
选项与参数:
-d  :后面可以接秒数,就是整个程序画面升级的秒数。默认是 5 秒;
-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 软件的按键。

-pstree:列出目前系统上面所有的程序树的相关性

[root@www ~]# pstree [-A|U] [-up]
选项与参数:
-A  :各程序树之间的连接以 ASCII 字节来连接;
-U  :各程序树之间的连接以万国码的字节来连接。在某些终端介面下可能会有错误;
-p  :并同时列出每个 process 的 PID;
-u  :并同时列出每个 process 的所属帐号名称。

2.进程的管理

进程管理通信:透过给予该程序一个讯号 (signal) 去告知。

主要的讯号代号与名称对应及内容是:

代号 名称 内容
1 SIGHUP 启动被终止的程序,可让该 PID 重新读取自己的配置档,类似重新启动
2 SIGINT 相当於用键盘输入 [ctrl]-c 来中断一个程序的进行
9 SIGKILL 代表强制中断一个程序的进行,如果该程序进行到一半, 那么尚未完成的部分可能会有『半产品』产生,类似 vim会有 .filename.swp 保留下来。
15 SIGTERM 以正常的结束程序来终止该程序。由於是正常的终止, 所以后续的动作会将他完成。不过,如果该程序已经发生问题,就是无法使用正常的方法终止时, 输入这个 signal 也是没有用的。
17 SIGSTOP 相当於用键盘输入 [ctrl]-z 来暂停一个程序的进行

kill -signal PID:kill 可以帮我们将这个 signal 传送给某个工作 (%jobnumber) 或者是某个 PID (直接输入数字)。

killall -signal 命令名称:

[root@www ~]# killall [-iIe] [command name]
选项与参数:
-i  :interactive 的意思,互动式的,若需要删除时,会出现提示字节给使用者;
-e  :exact 的意思,表示『后面接的 command name 要一致』,但整个完整的命令
  不能超过 15 个字节。
-I  :命令名称(可能含参数)忽略大小写。

范例一:给予 syslogd 这个命令启动的 PID 一个 SIGHUP 的讯号
[root@www ~]# killall -1 syslogd
# 如果用 ps aux 仔细看一下,syslogd 才是完整的命令名称。但若包含整个参数,
# 则 syslogd -m 0 才是完整的呢!

范例二:强制终止所有以 httpd 启动的程序
[root@www ~]# killall -9 httpd

3.程序的运行顺序

-Priority 与 Nice 值:

Linux 会给予程序一个『优先运行序 (priority, PRI)』, 这个 PRI 值越低代表越优先的意思。不过这个 PRI 值是由核心动态调整的, 使用者无法直接调整 PRI 值的。

如果想要调整程序的优先运行序时,就得要透过 Nice 值。

一般来说, PRI 与 NI 的相关性如下:

PRI(new) = PRI(old) + nice

不过要特别留意,如果原本的 PRI 是 50 ,并不是我们给予一个 nice = 5 ,就会让 PRI 变成 55 ! 因为 PRI 是系统『动态』决定的,所以,虽然 nice 值是可以影响 PRI ,不过, 最终的 PRI 仍是要经过系统分析后才会决定的。另外, nice 值是有正负的。此外,你必须要留意到:
nice 值可调整的范围为 -20 ~ 19 ;
root 可随意调整自己或他人程序的 Nice 值,且范围为 -20 ~ 19 ;
一般使用者仅可调整自己程序的 Nice 值,且范围仅为 0 ~ 19 (避免一般用户抢占系统资源);
一般使用者仅可将 nice 值越调越高,例如本来 nice 为 5 ,则未来仅能调整到大於 5;

那么如何给予某个程序 nice 值呢?有两种方式,分别是:

1.一开始运行程序就立即给予一个特定的 nice 值:用 nice 命令;
2.调整某个已经存在的 PID 的 nice 值:用 renice 命令。

nice :新运行的命令即给予新的 nice 值

[root@www ~]# nice [-n 数字] command
选项与参数:
-n  :后面接一个数值,数值的范围 -20 ~ 19。

renice :已存在程序的 nice 重新调整

[root@www ~]# renice [number] PID
选项与参数:
PID :某个程序的 ID

4.系统资源的观察

free :观察内存使用情况

[root@www ~]# free [-b|-k|-m|-g] [-t]
选项与参数:
-b  :直接输入 free 时,显示的单位是 Kbytes,我们可以使用 b(bytes), m(Mbytes)
  k(Kbytes), 及 g(Gbytes) 来显示单位喔!
-t  :在输出的最终结果,显示实体内存与 swap 的总量。

uname:查阅系统与核心相关资讯

[root@www ~]# uname [-asrmpi]
选项与参数:
-a  :所有系统相关的资讯,包括底下的数据都会被列出来;
-s  :系统核心名称
-r  :核心的版本
-m  :本系统的硬件名称,例如 i686 或 x86_64 等;
-p  :CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型!
-i  :硬件的平台 (ix86)

uptime:观察系统启动时间与工作负载

netstat :追踪网络或插槽档

[root@www ~]# netstat -[atunlp]
选项与参数:
-a  :将目前系统上所有的连线、监听、Socket 数据都列出来
-t  :列出 tcp 网络封包的数据
-u  :列出 udp 网络封包的数据
-n  :不以程序的服务名称,以埠号 (port number) 来显示;
-l  :列出目前正在网络监听 (listen) 的服务;
-p  :列出该网络服务的程序 PID 

dmesg :分析核心产生的信息

vmstat :侦测系统资源变化

[root@www ~]# vmstat [-a] [延迟 [总计侦测次数]] <==CPU/内存等资讯
[root@www ~]# vmstat [-fs]                      <==内存相关
[root@www ~]# vmstat [-S 单位]                  <==配置显示数据的单位
[root@www ~]# vmstat [-d]                       <==与磁碟有关
[root@www ~]# vmstat [-p 分割槽]                <==与磁碟有关
选项与参数:
-a  :使用 inactive/active(活跃与否) 取代 buffer/cache 的内存输出资讯;
-f  :启动到目前为止,系统复制 (fork) 的程序数;
-s  :将一些事件 (启动至目前为止) 导致的内存变化情况列表说明;
-S  :后面可以接单位,让显示的数据有单位。例如 K/M 取代 bytes 的容量;
-d  :列出磁碟的读写总量统计表
-p  :后面列出分割槽,可显示该分割槽的读写总量统计表

你可能感兴趣的:(linux,进程管理)