进程管理
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
什么是进程 (process)
一个程序被加载到内存当中运作,那么在内存内的那个数据就被称为进程(process)。在Linux系统中触发任何一个事件时,系统都会将他定义成为一个进程,并且给予这个进程一个 ID ,称为 PID,同时依据启发这个进程的用户与相关属性关系,给予这个 PID 一组有效的权限设定。
进程与程序 (process & program)
执行一个程序或指令就可以触发一个事件而取得一个 PID,不同的使用者身份执行这个 program 时,系统给予的权限也都不相同。由这个进程衍生出来的其他进程在一般状态下,也会沿用这个进程的相关权限。
- 程序 (program):通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体文 件的型态存在
- 进程 (process):程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载内存中, 操 作系统并给予这个内存内的单元一个标识符 (PID),可以说,进程就是一个正在运作中的程序
子进程与父进程之间的关系很复杂,最大的复杂点在于进程互相之间的呼叫。在 Linux 的 进程呼叫通常称为 fork-and-exec 的流程!进程都会由父进程以复制 (fork) 的方式产生一个一模一样的子进程, 然后被复制出来的子进程再以 exec 的方式来执行实际要进行的程序,最终就成为一个子进程的存在。
系统或网络服务是常驻在内存的进程,此这些常驻程序就会被我们称为:服务 (daemon),例如 crond,httpd等,最后的 d 就是代表 daemon 。
工作管理 (job control)
工作管理 (job control) 是用在 bash 环境下的,也就是说:当我们登入系统取得 bash shell 之 后,在单一终端机接口下同时进行多个工作的行为管理。
例如 背景下执行命令 cp file1 file2 &
之后在执行其他命令。
什么是工作管理
进行工作管理的行为中, 每个工作都是目前 bash 的子进程,亦即彼此之间是有相关性的。 我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的 bash。
- 工作所触发的进程必须来自于你 shell 的子进程(只管理自己的 bash)
- 前景:你可以控制与下达指令的这个环境称为前景的工作 (foreground)
- 背景:可以自行运作的工作,你无法使用 [ctrl]+c 终止他,可使用 bg/fg 呼叫该工作
- 背景中执行的进程不能等待 terminal/shell 的输入(input)
job control 的管理
- bash 只能够管理自己的工作而不能管理其他 bash 的工作,所以即使你是 root 也不能够将别人的 bash 底下的 job 给他拿过来执行。
- 利用 & 可以将某些工作直接丢到背景环境中执行,让我们可以继续操作前景的工作。 例:
tar -zpcvf /tmp/etc.tar.gz /etc &
。 - [ctrl - z] 可以暂停当前工作并将其扔到背景中,比如 正在使用 vim ,却发现我有个文件不知道放在哪里,需要到 bash 环境下进行搜寻,就可以使用 [ctrl - z]。
- 使用
jobs
命令查看背景中的工作,命令格式如下:
[root@study ~]# jobs [-lrs]
选项与参数:
-l :除了列出 job number 与指令串之外,同时列出 PID 的号码;
-r :仅列出正在背景 run 的工作;
-s :仅列出正在背景当中暂停 (stop) 的工作。
使用该命令后,会发现有 + 和 - , + 代表最近被放到背景的工作号码, - 代表最近最后第二个被放置到背景中的工作号码。 而超过最后第三个以后的工作,就不会有 +/- 符号,执行 fg
命令, 那个带 + 的工作就会在前景中处理。
- 将背景工作拿到前景来处理:
fg
,命令格式:fg %jobnumber
- 让工作在背景下的状态变成运作中:
bg
,使用 [ctrl - z]之后的命令为暂停状态,使用bg %jobnumber
让其在背景下 running。 - 管理背景当中的工作:
kill
,命令格式如下:
[root@study ~]# kill -signal %jobnumber
[root@study ~]# kill -l
选项与参数:
-l :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些
signal :代表给予后面接的那个工作什么样的指示啰!用 man 7 signal 可知:
-1 :重新读取一次参数的配置文件 (类似 reload);
-2 :代表与由键盘输入 [ctrl]-c 同样的动作;
-9 :立刻强制删除一个工作;
-15:以正常的进程方式终止一项工作。与 -9 是不一样的。
-9 这个 signal 通常是用在『强制删除一个不正常的工作』时所使用的, -15 则是以正常步骤结束一项工作(15 也是默认值)。
进程管理
注意的是:进程管理是管理所系统上所有的的进程,而工作管理(job control)仅管理具体某一个 shell 下的进程。
进程的观察
主要命令有 ps
、 top
、 pstree
。
ps
将某个时间点的进程运作情况撷取下来, 命令格式:
[root@study ~]# ps aux <==观察系统所有的进程数据
[root@study ~]# ps -lA <==也是能够观察所有系统的数据
[root@study ~]# ps axjf <==连同部分进程树状态
选项与参数:
-A :所有的 process 均显示出来,与 -e 具有同样的效用;
-a :不与 terminal 有关的所有 process ;
-u :有效使用者 (effective user) 相关的 process ;
x :通常与 a 这个参数一起使用,可列出较完整信息。 输出格式规划:
l :较长、较详细的将该 PID 的的信息列出;
j :工作的格式 (jobs format)
-f :做一个更为完整的输出。
常用的是 ps -l
只能查阅自己 bash 进程的和 ps aux
查阅所有系统运作的进程。 ps aux
没有那个减号 (-) 。
[root@study ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 14830 13970 0 80 0 - 52686 poll_s pts/0 00:00:00 sudo
4 S 0 14835 14830 0 80 0 - 50511 wait pts/0 00:00:00 su
4 S 0 14836 14835 0 80 0 - 29035 wait pts/0 00:00:00 bash
相关解释:
- 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 时间
- CMD:就是 command 的缩写,造成此进程的触发程序之指令为何
top
动态观察进程的变化,相对于 ps
是撷取一个时间点的进程状态, top
则可以持续侦测进程运作的状态 ,命令格式:
[root@study ~]# 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 软件的按键。
一般用于找出最损耗 CPU 资源的那个进程。
pstree
命令用于查看进程之间的相关性,命令格式:
[root@study ~]# pstree [-A|U] [-up]
选项与参数:
-A :各进程树之间的连接以 ASCII 字符来连接;
-U :各进程树之间的连接以万国码的字符来连接。在某些终端接口下可能会有错误;
-p :并同时列出每个 process 的 PID;
-u :并同时列出每个 process 的所属账号名称。
由 pstree
的输出可以知道所有的进程都是依附在 systemd 这支进程底下,这支进程的 PID 是一号,因为他是由 Linux 核心所主动呼叫的第一支程序,重新启动 systemd 就是 reboot。
进程的管理
通过给予进程一个信号 (signal) 去管理进程,常用信号:
代号 | 名称 | 内容 |
1 | SIGHUP | 启动被终止的进程,可让该 PID 重新读取自己的配置文件,类似重新启动 |
9 | SIGKILL | 代表强制中断一个进程的进行,如果该进程进行到一半, 那么尚未完成的部分可能会有半产品产生,类似 vim 会有 .filename.swp 保留下来 |
15 | SIGTERM | 以正常的结束进程来终止该进程。由于是正常的终止, 所以后续的动作会将他完成。不过,如 果该进程已经发生问题,就是无法使用正常的方法终止时, 输入这个 signal 也是没有用的 |
命令格式 : kill -signal PID
,kill 可以帮我们将这个 signal 传送给某个工作 (%jobnumber) 或者是某个 PID (直接输入数字)。 kill 后面直接加数字与加上 %number 的情况是不同的。
命令格式 : killall -signal 指令名称
,例 : killall -9 httpd
。
系统资源的观察
free
:观察内存使用情况
[root@study ~]# free [-b|-k|-m|-g|-h] [-t] [-s N -c N]
选项与参数:
-b :直接输入 free 时,显示的单位是 Kbytes,我们可以使用 b(bytes), m(Mbytes), k(Kbytes), 及 g(Gbytes) 来显示单位。也可以直接让系统自己指定单位 (-h)
-t :total, 在输出的最终结果,显示物理内存与 swap 的总量。
-s :可以让系统每几秒钟输出一次,不间断的一直输出的意思
-c :与 -s 同时处理,让 free 列出几次的意思
uname
:查阅系统与核心相关信息,命令格式:
[root@study ~]# uname [-asrmpi]
选项与参数:
-a :所有系统相关的信息,包括底下的数据都会被列出来;
-s :系统核心名称
-r :核心的版本
-m :本系统的硬件名称,例如 i686 或 x86_64 等;
-p :CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型!
-i :硬件的平台 (ix86)
dmesg
:分析核心产生的信息,系统在开机的时候,核心会去侦测系统的硬件,产生的信息可以用这个命令查看,数据较多一般配合 grep 使用 。
特殊文件与进程
查询整个系统的 SUID/SGID 的文件,使用 find / -perm /6000
。
/proc/* 代表的意义
进程都是在内存当中,内存当中的数据又都是写入到 /proc/* 中,的各个进程的 PID 都是以目录的型态存在于 /proc 当中。 比如,开机执行的第一支程序 systemd 的 PID 是 1 , 这个 PID 的所有相关信息都写入在 /proc/1/* 中。里边较重要的有:
文件/目录名 | 文件/目录内容 |
/proc/filesystems | 目前系统已经加载的文件系统 |
/proc/cpuinfo | 本机的 CPU 的相关信息,包含频率、类型与运算功能 |
/proc/cmdline | 加载 kernel 时所下达的相关指令与参数 |
/proc/modules | Linux 已经加载的模块列表,也可以想成是驱动程序 |
/proc/mounts | 系统已经挂载的数据,就是用 mount 这个指令呼叫出来的数据 |
/proc/partitions | 使用 fdisk -l 会出现目前所有的 partition的数据 |
/proc/version | 核心的版本,就是用 uname -a 显示的内容 |
查询已开启文件或已执行进程开启之文件
fuser
: 由文件系统找出正在使用该文件的进程,命令格式:
[root@study ~]# fuser [-umv] [-k [i] [-signal]] file/dir
选项与参数:
-u :除了进程的 PID 之外,同时列出该进程的拥有者;
-m :后面接的那个档名会主动的上提到该文件系统的最顶层,对 umount 不成功很有效!
-v :可以列出每个文件与进程还有指令的完整相关性!
-k :找出使用该文件/目录的 PID ,并试图以 SIGKILL 这个讯号给予该 PID;
-i :必须与 -k 配合,在删除 PID 之前会先询问使用者意愿!
-signal:例如 -1 -15 等等,若不加的话,预设是 SIGKILL (-9)
其中 -m 的英语解释为 All processes accessing files on that file system are listed 。 fuser -umv /root
与 fuser -uv /root/
输出相同。
lsof
:列出被进程所开启的文件名,命令格式:
[root@study ~]# lsof [-aUu] [+d]
选项与参数:
-a :多项数据需要『同时成立』才显示出结果时!
-U :仅列出 Unix like 系统的 socket 文件类型;
-u :后面接 username,列出该使用者相关进程所开启的文件;
+d :后面接目录,亦即找出某个目录底下已经被开启的文件!
# 不加参数列出目前系统上面所有已经被开启的文件与装置
pidof
:找出某支正在执行的程序的 PID,命令格式:
[root@study ~]# pidof [-sx] program_name
选项与参数: -s :仅列出一个 PID 而不列出所有的 PID
-x :同时列出该 program name 可能的 PPID 那个进程的 PID
范例: 列出目前系统上面 systemd 的 PID: pidof systemd
。
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |