进程管理
PROCESS MANAGEMENT
在任何时间,Linux 系统通常同时运行数百个,甚至数千个进程。进程只是一个正在运行和使用资源的程序。它包括终端,Web 服务器,任何正在运行的命令,任何数据库,GUI 界面等等。任何优秀的 Linux 管理员(特别是黑客)都需要了解如何管理他们的流程以优化他们的系统。例如,一旦黑客控制了目标系统,他们可能想要找到并停止某个进程,如防病毒应用程序或防火墙。为此,黑客首先需要知道如何找到该过程。黑客可能还想设置一个扫描脚本来定期运行以查找易受攻击的系统,因此我们还将研究如何安排这样的脚本。
在本章中,您将学习如何管理这些过程。首先,您将学习查看和查找流程以及如何发现哪些流程使用的资源最多。然后,您将学习如何通过在后台运行流程来管理流程,确定流程优先级,并在必要时将其删除。最后,您将学习如何安排在指定日期和日期以及特定时间运行的进程。
查看进程
在大多数情况下,管理进程的第一步是查看系统上正在运行的进程。ps命令是用于查看进程的主要工具。 在命令行中运行它以查看哪些进程处于活动状态:
kali >ps
PID TTY TIME CMD
39659 pts/0 00:00:01 bash
39665 pts/0 00:00:00 ps
Linux 内核是操作系统的核心,在创建进程时按顺序为每个进程分配一个唯一的进程 ID(PID)。在 Linux 中使用这些进程时,通常需要指定它们的 PID,因此进程的 PID 比进程的名称更重要。当没有使用参数的时候,ps命令并没有真正为您提供太多信息。
当前登录的用户(在我们的例子中是 root)以及该终端上正在运行的进程。在这里,它只是说 bash shell 是打开并运行的,我们使用了ps命令。我们想要并且需要更多的信息,尤其是关于这些进程由其他用户和后台系统运行。如果没有这些信息,我们对系统实际发生的情况知之甚少。使用选项 aux 运行 ps 命令将显示在其上运行的所有进程
系统适用于所有用户,如清单 6-1 所示。请注意,您不要在这些选项前添加前缀
使用短划线( - )并且所有内容都是小写的,因为 Linux 是大小写敏感的,所以使用大写选项会给你带来截然不同的结果。
kali >ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
Root 1 0.0 0.4 202540 6396 ? Ss Apr24 0:46 /sbin/init
Root 2 0.0 0.0 0 0 ? S Apr24 0:00 [kthreadd]
Root 3 0.0 0.0 0 0 ? S Apr24 0:26 [ksoftirqd/0]
snip
root 39706 0.0 0.2 36096 3204 pts/0 R+ 15:05 0:00 ps aux
清单 61: 使用 aux 参数查看进程
正如您所看到的,此命令现在列出了很多进程,它们可能会在屏幕底部运行。一个进程是 init,列在最后一列,最后一个进程是我们运行显示的命令,ps aux。许多细节(PID,%CPU,TIME,COMMAND 等)可能在您的系统上有所不同,但应具有相同的格式。出于我们的目的,以下是此输出中最重要的列:
USER 进程用户
PID 进程 id
%CPU CPU 占用率
%MEM 进程 CPU 占用率
COMMAND 进程名
通常,要对进程执行任何操作,我们必须指定其 PID。让我们看看如何使用这个标识符对我们更便利。
通过进程名过滤进程
当我们对进程执行操作时,我们通常不希望屏幕上显示所有进程细节。这是一个信息太多的问题。通常,我们希望查找有关单个进程的信息。为此,我们可以使用过滤命令grep,我在第 1 章中介绍过。
为了演示,我们将使用最广泛使用的开发框架和几乎每个黑客的好朋友 Metasploit 框架。这将安装在您的 Kali 系统上,因此请使用以下命令启动 Metasploit:
kali >msfconsole
开始使用 Metasploit 框架,让我们看看我们是否可以在进程列表中找到它。为此,请使用ps aux命令,然后将其(|)传递给 grep 寻找字符串 msfconsole,如清单图 6-2:
kali >ps aux | grep msfconsole
root 39756 0.0 0.0 4304 716 pts/2 Ss+ 15:13 0:00 sh c service postgresql start && msfdb init & msfconsole
root 39759 35.1 15.2 4304 227888 pts/2 Sl+ 15:13 1:36 ruby /usr/bin/ msfconsole
root 39892 0.0 0.0 4304 940 pts/2 S+ 15:18 0:00 grep msfconsole
清单 62:过滤特定进程
从此列表中的筛选输出中,您应该看到与术语msfconsole匹配的所有进程。首先显示 PostgreSQL 数据库是 Metasploit 使用的数据库,然后是来自/usr/bin/msfconsole 的 msfconsole 程序。最后,你应该看到用于查找 msfconsole 的 grep 命令。请注意,输出不包含 ps 的列标题列表。由于关键字 msfconsole 不在标题中,因此不会显示。即便如此,结果也以相同的格式显示。
从这里,您可以了解一些重要信息。例如,如果您需要知道 Metasploit 正在使用多少资源,您可以查阅第三列(CPU 列),看它是否使用了 35.1%的 CPU,并参考第四列以查看它是否使用了 15.2%的系统内存
通过 top 命令查找资源占用率过高的进程
输入 ps 命令时,进程按其顺序显示启动后,由于内核按照启动顺序分配 PID,所以您看到的是按 PID 编号排序的进程。
在许多情况下,我们想知道哪些进程使用了最多的资源。这就是 top 命令派上用场的地方,因为它显示按使用的资源排序的进程,从最大的进程开始。与 ps 命令不同的是,top 命令每 10 秒动态刷新一次列表,而 ps 命令只提供一次进程快照。您可以监视和监视那些需要资源的进程,如清单 6-3 所示。
kali >top
top 15:31:17 up 2 days, \^;50, 4 users, load average: 0.00, 0.04, 0.09
Tasks: 176 total, 1 running, 175 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.3 us, 0.7 sy, ).) ni, 97.4 id, 0.0 wa, 0.0 hi 0.0 si 0.0
KiB Mem : 1491220 total, 64848 free, 488272 used, 938100 buff/cache
KiB Swap : 1046524 total, 1044356 free, 2168 used. 784476 avail MEM
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
39759 root 20 0 893180 247232 11488 S 0.7 16.6 1:47.88 ruby
39859 root 20 0 27308 16796 14272 S 0.3 1.2 1:47.88 postgres
39933 root 20 0 293936 61500 29108 S 0.7 4.1 1:47.88 Xorg
snip
清单 63: 通过 top 查找资源消耗最多的进程
系统管理员经常让 top 在终端中运行,以监视进程资源的使用。作为一名黑客,您可能也想这样做,特别是在您的系统上运行多个任务时。当你运行 top 时,按下 H 还是?按键将弹出一个交互式命令列表,按下 Q 键将退出 top。不久您将再次使用 top 来管理您的进程,在下一小节的“使用 nice 命令改变进程优先级”和 “终止进程”中。
管理进程
黑客经常需要多进程运行多个程序,像 Kali Linux 这样的操作系统是理想的。黑客可能在运行漏洞扫描程序和攻击时同时运行端口扫描程序。这要求黑客有效地管理这些程序,以最好地利用系统资源并完成任务。 在本节中,我将向您展示如何管理多个进程。
使用 nice 命令改变进程优先级
在黑客的语境中,你不会经常听到 nice 这个词,但在这里你会听到。nice 命令用于影响进程对内核的优先级。正如您在运行 ps 命令时看到的,系统上同时运行着许多进程,它们都在争夺可用的资源。内核将对进程的优先级拥有最终决定权,但是您可以使用 nice 建议提高进程的优先级。
使用 nice 这个术语背后的想法是,当您使用它时,您将决定对其他用户有多“好”:如果您的进程使用了大部分系统资源,那么就会对其他进程产生影响。
nice 的值范围从-20 到+19,默认值为 0(参见图 6-1)。高 nice 值为低优先级,低 nice 值为高优先级(当您对其他用户和进程不太友好时)。当进程启动时,它继承其父进程的 nice 值。进程的所有者可以降低进程的优先级,但不能增加其优先级。当然,超级用户或根用户可以随意将 nice 值设置为他们喜欢的任何值。
图 61: nice 优先级数值
启动进程时,可以使用 nice 命令设置优先级,然后在使用 renice 命令开始运行进程后更改优先级。这两个命令的语法略有不同,可能会令人困惑。nice 命令要求增加 nice 值,而 renice 命令要求 niceness 的绝对值。让我们看一个例子来证明这一点。
在运行进程时设置优先级
出于演示目的,我们假设我们有一个名为 slowprocess 的进程位于/ bin / slowprocess。如果我们希望它加速执行完成,我们可以使用 nice 命令启动该过程:
kali >nice -n -10 /bin/slowprocess
此命令会将 nice 值递增-10,从而增加其优先级并为其分配更多资源。
另一方面,如果我们想要对我们的用户和流程很好,并给予 slowprocess 一个较低的优先级,我们可以将其好的值正增加 10:
kali >nice -n 10 /bin/slowprocess
尝试一下当前正在运行的进程,然后运行 ps 以查看它是如何更改的,如果有的话。
使用 renice 命令改变正在运行的进程优先级
renice 命令采用介于-20 和 19 之间的绝对值,并将优先级设置为该特定级别,而不是从其开始的级别增加或减少。此外,renice 需要您所针对的进程的 PID 而不是名字。因此,如果 slowprocess 在您的系统上使用过多的资源 ,并且你想给它一个较低的优先级,从而允许其他进程具有更高的优先级和更多的资源,你可以重新设置 slowprocess(PID 为 6996)并给出一个更高的值,如下:
kali >renice 20 6996
与 nice 一样,只有 root 用户可以将进程重新设置为负值以赋予其更高的优先级,但任何用户都可以使用 renice 来降低优先级。
您还可以使用 top 工具更改 nice 值。随着 top 运行,只需按 R 键,然后提供 PID 和 nice 值。如清单 6-4 中 top 正在运行,当我按下 R 键并提供 PID 和 nice 值时,我得到以下输出:
清单 64: 通过 top 改变 nice 值
当我按下 R 键时,我被要求带有文本 renice PID [value]的 PID➊ 值。 然后应该改变输出以反映新的优先级。
终止进程
有时,进程会消耗太多的系统资源,表现出异常的行为,或者假死。表现出这种行为的过程通常被称为僵尸过程。对你来说,最有问题的症状可能是僵尸进程使用的浪费资源,可以更好地分配给有用的进程。
当您确定有问题的进程时,您可能希望使用 kill 命令来阻止它。有许多不同的杀死程序的方法,每个方法都有自己的进程选项(数字)。
kill 命令有 64 种不同的 kill 标志,每种标志略有不同。在这里,我们专注于您可能会发现最有用的一些参数,kill 命令是kill-signal PID,其中标志开关是可选的。如果你不提供信号标志,默认为 SIGTERM。能够列出常见的 kill 标志。
表 61: 常用的 kill 标志信号
标志 | 选项参数 | 描述 |
---|---|---|
SIGHUP | 1 | 这称为挂起(HUP)标志信号。它会停止指定的进程并使用相同的 PID 重新启动它。 |
SIGINT | 2 | 这是中断(INT)信号。这是一个弱信号,不能保证工作,但它在大多数情况下都有效。 |
SIGQUIT | 3 | 这称为核心转储。它终止进程并将进程信息保存在内存中,然后将此信息保存在当前工作目录中的一个名为 core 的文件中。(这样做的原因超出了本书的范围。) |
SIGTERM | 15 | 这是终止(TERM)信号。这是 kill 命令的默认 kill 信号。 |
SIGKILL | 9 | 这是强制终止信号。它通过将进程的资源发送到特殊位置/dev/null 来强制进程停止。 |
使用 top 命令,您可以识别哪些进程使用了太多资源,通常,这些进程是合法的,但可能有恶意进程占用资源,您想要杀死此进程。
如果您只想使用 HUP 信号重新启动进程,请使用 kill 输入-1 选项,如下所示:
kali >kill -1 6996
对于僵尸或恶意进程,您可能发送 kill -9 信号。
kali >kill -9 6996
如果您不知道进程的 PID,则可以使用 killall 命令终止进程。此命令将进程的名称(而不是 PID)作为参数。
例如,您可以终止假设的僵尸进程,如下所示
>killall -9 zombieprocess
最后,您还可以在 top 命令中终止进程。只需按 K 键,然后输入需要终止进程的 PID。
在后台运行进程
在 Linux 中,无论您是使用命令行还是 GUI,您都在 shell 中工作。所有运行的命令都是从该 shell 中执行的,即使它们是从图形界面运行的。执行命令时,shell 会等待命令完成,然后再提供另一个命令提示符。
有时,您可能希望进程在后台运行,而不必等待它在该终端中完成。例如,假设我们想在文本编辑器中处理脚本,因此通过输入以下内容调用我们的文本编辑器(leafpad):
kali >leafpad newscript
当然,我们可以打开另一个终端来运行更多命令,但更好的选择是节省资源和屏幕空间是启动在后台运行的文本编辑器。在后台运行进程只意味着它将继续运行而无需终端 通过这种方式,终端可以免除其他职责。
要在后台启动文本编辑器,只需在命令末尾添加一个与号(&),如下所示:
kali >leafpad newscript &
现在,当文本编辑器打开时,终端返回一个新的命令提示符,这样我们就可以在系统上输入其他命令,同时编辑我们的新闻稿。这对于您希望使用终端时可能会运行很长时间的任何进程都有效。 作为黑客,您会发现这对于运行多个具有多个任务的终端非常有用,可以节省资源和屏幕空间。
把后台运行的进程移到前台
如果要将在后台运行的进程移动到前台,可以使用 fg(foreground)命令。 fg 命令需要您想要返回到前台的进程的 PID,如下所示。
kali >fg 1234
如果我们不知道具体的 pid,我们可以使用 ps 命令查看。
定时执行程序
Linux 系统管理员和黑客通常都需要安排在一天中的特定时间运行的进程。例如,系统管理员可能希望安排系统备份在每个星期六晚上 2 点运行。黑客可能希望设置一个脚本来运行以定期执行侦察,找到开放端口或漏洞。在 Linux 中,您可以通过至少两种方式实现此目的:使用 at 和 crond。
at命令是守护进程(后台进程)对于将作业安排在将来的某个时刻运行一次非常有用。crond 更适合于安排任务每天,每周或每月发生,我们将在第 16 章详细介绍。我们使用at守护进程来安排将来执行命令或命令集。语法只是at命令,后跟执行时间处理。时间参数可以各种方式提供。
表 62: 命令行可用的时间格式
时间格式 | 含义 |
---|---|
at 7:20pm | 计划于当天晚上 7:20 运行 |
at 7:20pm June 25 | 计划于 6 月 25 日晚上 7 点 20 分开始运行 |
at noon | 计划在当天中午运行 |
at noon June 25 | 计划于 6 月 25 日中午开始运行 |
at tomorrow | 计划明天运行 |
at now + 20 minutes | 计划从当前时间起 20 分钟内运行 |
at now + 10 hours | 计划从当前时间起 10 小时内运行 |
at now + 5 days | 计划从当前日期起五天内运行 |
at now + 3 weeks | 计划从当前日期起三周内运行 |
At 7:20pm 06/25/2019 | 计划于 2019 年 6 月 25 日晚上 7 点 20 分开始运行 |
当您使用指定的时间进入at守护进程时,进入交互模式时,您会看到 at>提示符。您可以在此处输入要在指定时间执行的命令:
kali >at 7:20am
at >/root/myscanningscript
此代码片段将安排 myscanningscript 今天上午 7:20 执行。
总结
管理 Linux 中的进程是每个 Linux 用户和黑客的技能。您必须能够查看,查找,终止,确定优先级并让进程以最佳方式运行。黑客通常需要在他们想要杀死的目标上找到进程,例如防病毒软件或防火墙。他们还需要管理攻击中的多个进程并确定其优先级。