学习目标:掌握Linux系统上的进程,并对其进行相应的管理。
掌握知识点:
- 获取运行中的程序信息,并了解其运行状态、资源使用情况以及所有权,并对其进行相应的控制。
- 使用 Bash作业控制来管理从同一终端会话启动多个进行。
- 控制与终止与shell无关的进程,强制结束用户会话和进程。
一、列出进程
1.1 进程的定义
进程是已启动的可执行程序的运行中实例。进程由以下组成部分:
- 已分配内存的地址空间
- 安全属性,包括所有权凭据和特权
- 程序代码的一个或多个执行线程
- 进程状态
进程的环境包括:
- 本地和全局变量
- 当前调度上下文
- 分配的系统资源,如文件描述符和网络端口
现有的(父)进程复制自己的地址空间(fork)来创建一个新的(子)进程结构。
每个新进程分配有一个唯一进程ID(PID)。PID和父进程ID(PPID)是新进程环境的元素。任何进程可创建子进程。
所有进程都是第一个系统进程的后代,在红帽企业Linux 8系统上,第一个系统进程是systemd。
通过fork例程,子进程继承安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量, 以及程序代码。随后,子进程可从exec其自己的程序代码。通常,父进程在子进程运行期间处于睡 眠状态,设置一个在子进程完成时发出信号的请求(wait)。在退出时,子进程已经关闭或丟弃了其资源和环境。唯一剩下的资源称为僵尸进程(Zombie),是进程表中的一个条目。父进程在子进程退出时收到信号而被唤醒,清理子条目的进程表,由此释放子进程的最后一个资源。然后,父进程继续执行自己的程序代码。
1.2 进程的状态描述
在多任务处理操作系统中,每个CPU (或CPU核心)在一个时间点上处理一个进程。在进程运行时,它对CPU时间和资源分配的直接要求会有变化。进程分配有一个状态,它随着环境要求而改变。
在对系统进行故障排除时,了解內核如何与进程通信以及进程如何相互通信非常重要。在创建进程时,系统会为进程分配一个状态。top命令的S列或ps的STAT列显示每个进程的状态。在单 CPU系统上,一次只能运行一个进程。可以看到多个状态为R的进程。然而,并非所有这些进程都在持续运行,其中一些将处于等待状态。
1.3 列出进程
ps命令用于列出当前的进程。它可以提供详细的进程信息。
# 查看进程信息 ps aux
接下来对各项进行简要说明:
- USER:进程所属者
- PID:进程的ID
- %CPU:进程占用的CPU百分比
- %MEM:占用内存的百分比
- VSZ:该进程使用的虚拟内存量(KB为单位)
- RSS:该进程占用固定内存量(KB为单位,即常驻内存数量)
- TTY:该进程在哪个终端上运行(即登录终端的位置,若与终端无关,则显示?,若为pts/0等,则表示由网络连接主机进程)
- STAT:状态 信息
- START:该进程被触发启动的时间
- TIME:该进程实际使用CPU运行的时间
- COMMAND:命令的名称以及参数信息
aux是最常见的选项集,它可显示包括无控制终端的进程在内的所有进程。长列表(选项 lax)提供更多技术详细信息,但可通过避免查询用户名来加快显示。相似的UNIX语法使用选项-ef来显示所有进程。
二、作业控制
2.1 描述作业和会话
作业控制是shell的一种功能,允许单个shell实例运行和管理多个命令。
作业与在shell提示符中输入的每个管道相关联。该管道中的所有进程均是作业的一部分,并且是同 一个进程组的成员。如果在shell提示符处仅输入了一条命令,则这条命令可视为命令的最小“管道”,创建仅含有一个成员的一个作业。
一次只能有一个作业从特定终端窗口中读取输入和键盘生成的信号。属于该作业的进程是该控制终端的前台进程。
该控制终端的后台进程是与该终端相关联的任何其他作业的成员。终端的后台进程无法从终端读取 输入或接收键盘生成的中断,但可以写入终端。后台中的作业可能已停止(暂停),也可能正在运 行。如果某个正在运行的后台作业尝试从终端读取内容,则该作业将自动暂停。
每个终端是其自身的会话,并且可以具有一个前台进程和任意数量的独立后台进程。一个作业只能 属于一个会话,也就是属于其控制终端的会话。
PS命令在TTY列中显示进程的控制终端的设备名称。某些进程(如系统守护进程)由系统启动, 并不是从shell提示符启动。这些进程没有控制终端,也不是作业的成员,并且无法转至前台。ps 命令在TTY列中针对这些进程显示一个问号(?)。
2.2 在后台运行作业
任何命令或管道都可以在后台启动,只需在命令行的结尾处附加符号&即可。Bash shell显示作业编号(特定于会话的唯一编号)和新建子进程的PID。shell不等待子进程终止,而会显示shell提示符。
# 后台运行 sleep sleep 60 &
可以使用fg命令和后台作业的ID (%作业编号)将该后台作业转至前台。需要注意的是,作业号是在执行 “sleep 60 &” 反反馈回来的号,使用“[]” 号括起来。
# 将后台作业,通过作业号转到前台。 fg %1
在前台运行中的程序,如果想结束,可以使用Ctrl+z 来结束。也可以通过“ps j”命令来查看作业相关的信息。
# 查看作业相关的信息,j即为job(作业) ps j
PPID:是此进程的父进程(即启动此进程的进程)
PID:是进程的唯一进程ID
PGID:是进程组首进程的PID,通常是作业管道中的第一个进程
SID:是会话首进程的PID对于作业而言,这通常是正在其控制终端上运行的交互shell
TPGID:进程连接到的 tty(终端)上的前台进程组的 ID,如果进程未连接到 tty,则为 -1。通常用来判断是否为守护进程,是则为-1,不是则为其他。
STAT:为状态信息,如果为T,则作业为停止状态
2.3 练习
(1)在你所登录的用户主目录下,创建一个新目录 bin。
(2)并在目录下创建一个名称为“ control ”的shell脚本,使用Vim 对 shell 脚本文件进行创建或修改,在交互模式下,按i键,将如下内容敲入其内,并使用:wq保存并退出。
#!/bin/bash while true; do echo -n "$@ " >> ~/control_outfile sleep 1 done
此control脚本会一直运行到被终止为止。它将每隔一秒向文件 ~/control_outfile 附加一次命令行参数。
(3)并将脚本设置为可执行权限,并执行脚本,执行方法为:“./control”。
(4)重新打开一个终端,使用“ tail -f ~/control_outfile ”命令来进行查看。
(5)终止执行中的程序,可以使用快捷键 Ctrl+z。
三、中断进程
3.1 使用信号控制进程
信号是传递至进程的软件中断。信号向执行中的程序报告事件。生成信号的事件可以是错误或外部 事件(I/O请求或定时器过期),或者来自于显式使用信号发送命令或键盘序列。下表列出了系统管理员用于日常进程管理的基本信号。通过短名称(HUP)或正确名称(SIGHUP)指代信号。
每个信号都有一个默认操作,通常是如下之一:
- 终止:导致程序立即终止(退出)。
- 核心转储:导致程序保存内存镜像(核心转储),然后终止。
- 停止:导致程序停止执行(暂停),再等待继续(恢复)。
程序可以通过实施处理程序例程来为响应预期的事件信号做准备,以忽略、替换或扩展信号的默认操作。
可以向当前的前台进程发送信号,具体操作为按下键盘控制序列以暂停(Ctrl+z)、中止 (Ctrl+c)或核心转储(Ctrl+\)该进程。其实是使用信号发送命令向后台进程或另一会话中的进程发送信号。
可以通过名称(例如:-HUP或-SIGHUP)或编号(相关的-1)将信号指定为选项。用户可以中断自己的进程,但需要root特权才能终止由其他人拥有的进程。
kill命令根据PID编号向进程发送信号。虽然其名称为kill, 但该命令可用于发送任何信号,而不仅仅是终止程序的信号。可以使用kill -l命令列出所有可用信号的名称和编号。
# 列出所有可用信号 kill -l # 执行等待 sleep 1000 & # 在进程列表中查找 sleep ps aux | grep sleep # 通过 PID 结束sleep进程 6000为你看到的sleep的进程号(PID) kill 6000 kill -9 6000 kill -SIGTERM 6000
killall命令可以根据命令名称向多个进程发送信号。
# 启动多个 sleep 进程 sleep 1000 & sleep 1000 & sleep 1000 & # 结束所有 sleep killall sleep
pkill向一个或多个符合选择条件的进程发送信号。选择的条件可以是命令名称、特定用户拥有的进程,或者所有系统范围进程。pkill 命令包括高级选择条件:
- 命令:具有模式匹配的命令名称的进程。
- UID:由某一Linux用户帐户拥有的进程,无论是有效的还是真实的。
- GID :由某一Linux组帐户拥有的进程,无论是有效的还是真实的。
- 父级:特定父进程的子进程。
- 终端:运行于特定控制终端的进程。
# 启动多个 sleep 进程 sleep 1000 & sleep 1000 & sleep 1000 & # 结束所有 sleep pkill sleep
3.2 以管理员身份注销用户
出于各种各样的原因,可能需要注销其他用户。以下是许多可能性中的一些示例:
- 用户做出了安全违规行为;
- 用户可能过度使用了资源;
- 用户的系统可能不响应;
- 用户不当访问了资料等。
在这些情况下,可能需要以管理员身份使用信号来终止其会话。
要注销某个用户,首先确定要终止的登录会话。使用W命令列出用户登录和当前运行的进程。记录 TTY和FROM列, 以确定要关闭的会话。
所有用户登录会话都与某个终端设备(TTY)相关联。如果设备名称的格式为pts/N,说明这是一个与图形终端窗口或远程登录会话相关联的伪终端。如果格式为ttyN, 则说明用户位于一个系统控 制台、替代控制台或其他直接连接的终端设备上。
# 查看登录信息 w
使用w命令后,显示的列表内容解释:
- USER:登录用户
- TTY:登录用户使用终端名称
- FROM:登录用户来源主机名或IP地址
- LOGIN@:用户登录时长
- IDLE:自用户上一次与终端进行交互以来的空闲时间
- JCPU:附加到tty的所有进程使用的时间
- PCPU:用户当前进程所用的时间,即显示在 WHAT 字段的
- WHAT:用户当前的进程及选项/参数
可以逐一向进程和会话发送信号,也可以集体发送。要终止一个用户的所有进程,可使用Pkill命 令。由于登录会话中的初始进程(会话首进程)设计为可以处理会话终止请求并忽略不想要的键盘 信号,中断某一用户的所有进程和登录shell需要使用SIGKILL信号。