我们都遵循某些流程来实现我们的目标,类似的是,每个系统都有自己的进程来完成任务。
在 Linux 系统中执行的每个程序或命令都被称为一个进程。
在本教程中,让我们来探讨进程以及我们如何在 Linux 中管理它们。
什么是Linu进程
理论上,一个进程被称为一个正在执行的程序,就是一个系统目前正在进行的任务。
你在系统上的每一个动作都会导致一个新的进程。例如,打开一个浏览器就会启动一个进程。
简单地说,一个进程是一个程序的实例。用户的操作被转化为一个命令,在执行该命令时将会创建一个新的进程。
进程按照父-子层次结构工作。正如层次结构的名称所表示的那样,由命令/程序启动的进程被称为父进程,父进程产生的进程被称为子进程。
Linux进程的类型
在 Linux 发行版中,进程被分为两种类型:
- 前台进程
- 后台进程
前台进程
一个需要用户使用终端命令或程序来启动的进程被称为前台进程。这意味着前台进程需要一个来自用户的输入触发。所以每个前台进程都是手动触发的。
每当一个进程在前台运行时,其他进程应该等待,直到当前进程完成。
证明这一点的最好例子是通过 sleep
命令。sleep
命令不允许用户与终端互动,直到达到给定的时间。
sleep 10
终端命令在前台延迟 10 秒
sleep
终端命令在前台运行并暂停用户输入
我们应该等待 10 秒钟,以访问终端运行另一个命令。
后台进程
一个独立于用户输入运行的进程被称为后台进程。与前台进程不同,我们可以在一个后台进程中同时运行多个进程。
要在后台运行一个进程,在你用来启动该进程的命令的结尾处放一个安培号(&)。
这里有一个例子:
让我们在一个后台进程中执行 sleep
命令。它将在后台运行,并将终端还给我们以运行其他命令。
后台进程的终端命令示例
sleep 10 &
终端命令在后台延迟 10 秒
现在我们可以看到,上述命令在后台运行。它创建了一个 PID
19003 的进程。所以我们可以同时运行另一条命令(pwd
命令)。
如何将一个前台进程改为后台进程
如果我们在前台启动一个进程并想把它放到后台,我们可以用 bg
命令来实现。让我们看看如何将前台进程改为后台。
如果一个进程正在运行,按 CTRL+Z
键。这个命令将暂停当前进程。
然后运行 bg
命令。它接受一个进程 ID 作为参数,并将该进程放入后台。如果参数为空,它将把当前暂停的进程放入后台。
bg <process_id>
将进程移至后台的命令
bg
将上一个进程移到后台的命令
我们可以看到暂停的命令(sudo apt update
)在后台恢复了。
如何列出Linux进程
在我们介绍如何做到这一点之前,你应该知道为什么你可能需要知道一个进程的列表。这里有几个原因:
- 要知道哪个进程消耗的时间更多
- 要知道哪个进程占用更多的内存和 CPU
- 要知道一个正在运行的进程所触发的命令
要查看当前正在运行的进程,我们可以使用 ps
(Process Status 进程状态)命令:
ps
列出正在运行的进程的终端命令
要列出每个登录用户的所有进程的摘要,我们可以使用 w
命令。这个命令是 Linux 中 who
、uptime
和 ps -a
命令的结合。
w
列出所有登录用户的进程的终端命令
如何以树状视图列出进程
当一个程序/命令运行时,它启动了一个被称为“父进程”的主进程。父进程可能依赖于其他一些命令/程序,这将创建一个子进程。
下面的截图是一个例子。
在上面的截图中,Firefox 是父进程,其他进程是其子进程。
让我们来探讨一下如何以树状结构列出进程。
pstree
是一个 Linux 命令,用于以树状结构列出所有用户的当前运行进程。它被用作 ps
命令的一个更直观的替代。
pstree
将进程以树状结构列出的终端命令
我们可以看到,正在运行的进程是以树状形式显示的。这对于可视化进程是很有用的。
在命令中添加 -p
标志将显示每个分支和其进程 ID。
pstree -p
以树状结构显示一个父进程的子进程的终端命令
要列出一个特定进程的子进程,请将进程 ID 作为参数传给 pstree
命令。
pstree 3149
列出进程 id 3149 的进程的终端命令
在上文中,我提到 pstree
命令列出了所有用户的进程。在 pstree
命令中传递用户名,只列出该用户运行的进程。
pstree root
上面的截图显示了由 root
用户运行的进程。
如何查看某个程序的进程
很多开发者可能都遇到过以下情况:
在进行 web 开发项目时,我们使用 Chrome、Firefox 等不同的浏览器来验证输出。
有些开发者会不断地打开标签,而从不关闭已打开的标签。由于负载过重(如果打开了 150 多个标签),浏览器有时会没有反应😣导致系统挂起。最糟糕的是,我们将无法关闭浏览器😂。
与 Windows 不同,我们在 Linux 中没有任务管理器来杀死浏览器。
这个问题在 Linux 中也可以轻松解决。让我们看看一个 Linux 专家是如何处理这种情况的。
我们知道,每个程序(包括浏览器)都是作为一个进程运行的。所以,你只需要找到进程的 ID,然后关掉它。
让我们看看如何找到你需要的一个命令/程序的进程 ID。
在我的系统中,Chrome 正在运行,现在我们可以通过运行以下命令得到 Chrome 的 PID:
pidof chrome
查找进程 ID 的终端命令
如何杀死一个进程
在 Linux 中,有一个叫作 kill
的命令,通过传递 PID(进程 ID)或进程名称来杀死任何进程。
下面是 kill
命令的语法:
kill <pid/processname>
kill 命令的语法
让我们存储 Chrome 的 PID,并使用 kill
命令杀死它:
a=$(pidof chrome)kill $a
杀死一个进程的命令
上述命令将杀死 Chrome web 浏览器。
如何列出所有进程
我们可以使用 top
命令查看所有的 Linux 进程。它为所有用户显示每个进程的实时更新。
top
实时列出所有进程的命令
让我们了解一下标题,以理解下方的数据。
- PID 代表一个唯一的进程 ID
- USER 代表任务所有者的用户名
- PR 代表该进程的优先级,数字越小,优先级越高
- NI 代表任务的优先级,一个负的 Nice 值意味着更高的优先级,一个正的 Nice 值意味着更低的优先级
- VIRT 代表任务使用的总虚拟内存
- RES 代表一个进程的 RAM 使用量,以千字节为单位
- SHR 代表一个进程使用的共享内存大小(Kb)
- S 代表进程的状态:
– *D*:不间断的睡眠
– *R*:运行
– *S*:睡眠
– *T*:追踪(已停止)
– *Z*:僵尸 - CPU 代表 CPU 使用率
- MEM 代表任务的内存使用量
- TIME 代表 CPU 时间
- COMMAND 代表用于启动进程的命令
要显示特定的用户进程,我们应该使用标志 -u
:
top -u <username>
列出特定用户进程的终端命令语法
要查看由用户 gogosoon
运行的进程,请运行以下命令:
top -u gogosoon
列出由用户 gogosoon
启动的进程的终端命令
你可能对命令行的输出感到困惑 😆。这对实时调试进程来说有点困难。
这里有一个方便的 GUI 工具来处理 Linux 中的进程。但我们必须手动安装这个工具。这将更像 Windows 中的任务管理器。
sudo apt install gnome-system-monitor
安装系统监控应用程序的终端命令
安装后,只需在终端输入软件的名称:
gnome-system-monitor
在 GUI 中打开进程列表的命令
这将在一个新的窗口中打开所有的进程,并有一个不错的 GUI:
当我们右键点击任何进程时,它将显示诸如杀死、停止、结束等操作。
资源选项卡显示以下工具:
- CPU 历史
- 内存和交换历史
- 网络历史
这些图表对确定你的系统中的负载很有用。
总结
在这篇文章中,你已经了解了 Linux 中进程的基本知识。我希望你现在能更好地理解它们是如何工作的。我建议你在你的系统中尝试这些命令。