RHCSA学习笔记-07进程管理

RHCSA学习笔记-07进程管理

  • 最近更新2022年05月19日

学习目标:掌握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命令列出用户登录和当前运行的进程。记录 TTYFROM列, 以确定要关闭的会话。

所有用户登录会话都与某个终端设备(TTY)相关联。如果设备名称的格式为pts/N,说明这是一个与图形终端窗口或远程登录会话相关联的伪终端。如果格式为ttyN, 则说明用户位于一个系统控 制台、替代控制台或其他直接连接的终端设备上。

# 查看登录信息
w

使用w命令后,显示的列表内容解释:

  • USER:登录用户
  • TTY:登录用户使用终端名称
  • FROM:登录用户来源主机名或IP地址
  • LOGIN@:用户登录时长
  • IDLE:自用户上一次与终端进行交互以来的空闲时间
  • JCPU:附加到tty的所有进程使用的时间
  • PCPU:用户当前进程所用的时间,即显示在 WHAT 字段的
  • WHAT:用户当前的进程及选项/参数

可以逐一向进程和会话发送信号,也可以集体发送。要终止一个用户的所有进程,可使用Pkill命 令。由于登录会话中的初始进程(会话首进程)设计为可以处理会话终止请求并忽略不想要的键盘 信号,中断某一用户的所有进程和登录shell需要使用SIGKILL信号。

 

 

 

分享到 :
相关推荐

发表回复

您的电子邮箱地址不会被公开。