如何使用 ps、kill 和 nice 管理 Linux 中的进程

介绍

一个Linux服务器,就像任何现代计算机一样,运行多个应用程序,这些应用程序被称为单个 _processes。

虽然Linux在一个过程的生命周期中将处理低层次的后台管理 - 即启动、关闭、内存分配等 - 你需要一种与操作系统互动的方式来从更高层次管理它们。

在本指南中,您将了解流程管理的一些基本方面,Linux为此提供了一些标准的内置工具。

你将在Ubuntu 20.04环境中探索这些想法,但任何现代的Linux发行版都会以类似的方式运作。

步骤1:如何在Linux中查看运行过程

您可以通过使用顶部命令查看在您的服务器上运行的所有流程:

1top
 1[secondary_label Output]
 2top - 15:14:40 up 46 min, 1 user, load average: 0.00, 0.01, 0.05
 3Tasks:  56 total, 1 running, 55 sleeping, 0 stopped, 0 zombie
 4Cpu(s):  0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
 5Mem:   1019600k total, 316576k used, 703024k free, 7652k buffers
 6Swap:        0k total, 0k used, 0k free, 258976k cached
 7
 8  PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+  COMMAND           
 9    1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 init               
10    2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd           
11    3 root 20 0 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/0        
12    6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0        
13    7 root RT 0 0 0 0 S 0.0 0.0 0:00.03 watchdog/0         
14    8 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 cpuset             
15    9 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper            
16   10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs

第一几个输出行提供系统统计数据,例如CPU/内存负载和运行任务总数。

您可以看到有 1 个运行过程,以及 55 个被认为是 sleeping 的过程,因为它们没有积极使用 CPU 周期。

显示的剩余输出显示了运行过程及其使用统计数据。默认情况下,顶部会自动按CPU使用量排序这些过程,因此您可以首先看到最繁忙的过程。顶部将继续在您的壳中运行,直到您使用标准的键组合Ctrl+C来停止运行过程。

在Ubuntu 20.04上,你可以用apt安装它:

1sudo apt install htop

之后,HOTP命令将可用:

1htop
 1[secondary_label Output]
 2  Mem[|||||||||||           49/995MB]     Load average: 0.00 0.03 0.05 
 3  CPU[                          0.0%]     Tasks: 21, 3 thr; 1 running
 4  Swp[                         0/0MB]     Uptime: 00:58:11
 5
 6  PID USER PRI NI VIRT RES SHR S CPU% MEM%   TIME+  Command
 7 1259 root 20 0 25660 1880 1368 R 0.0 0.2 0:00.06 htop
 8    1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 /sbin/init
 9  311 root 20 0 17224 636 440 S 0.0 0.1 0:00.07 upstart-udev-brid
10  314 root 20 0 21592 1280 760 S 0.0 0.1 0:00.06 /sbin/udevd --dae
11  389 messagebu 20 0 23808 688 444 S 0.0 0.1 0:00.01 dbus-daemon --sys
12  407 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.02 rsyslogd -c5
13  408 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.00 rsyslogd -c5
14  409 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.00 rsyslogd -c5
15  406 syslog 20 0 243M 1404 1080 S 0.0 0.1 0:00.04 rsyslogd -c5
16  553 root 20 0 15180 400 204 S 0.0 0.0 0:00.01 upstart-socket-br

「htop」提供更好的多個CPU線的可視化,現代終端的色彩支援的更好認識,以及更多的排序選項,其他功能之間。 與「top」不同,它並不總是默認安裝,但可以被認為是一種 drop-in替代。 您可以通過按「Ctrl+C」來退出「htop」。

在下一节中,您将了解如何使用工具来查询特定流程。

步骤 2 – 如何使用 ps 列出流程

顶部顶部提供一个仪表板界面,以查看运行过程类似于图形任务管理器。仪表板界面可以提供概述,但通常不会直接返回可操作的输出。

运行ps没有任何论点提供了很少的信息:

1ps
1[secondary_label Output]
2  PID TTY TIME CMD
3 1017 pts/0 00:00:00 bash
4 1262 pts/0 00:00:00 ps

此输出显示了与当前用户和终端会话相关的所有流程,如果您目前在该终端中仅运行bash壳和此ps命令,则有意义。

要获得这个系统中的流程的更完整的图像,您可以运行ps aux:

1ps aux
 1[secondary_label Output]
 2USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
 3root 1 0.0 0.2 24188 2120 ?        Ss 14:28 0:00 /sbin/init
 4root 2 0.0 0.0 0 0 ?        S 14:28 0:00 [kthreadd]
 5root 3 0.0 0.0 0 0 ?        S 14:28 0:00 [ksoftirqd/0]
 6root 6 0.0 0.0 0 0 ?        S 14:28 0:00 [migration/0]
 7root 7 0.0 0.0 0 0 ?        S 14:28 0:00 [watchdog/0]
 8root 8 0.0 0.0 0 0 ?        S<   14:28 0:00 [cpuset]
 9root 9 0.0 0.0 0 0 ?        S<   14:28 0:00 [khelper]
10

这些选项表示ps以显示所有用户(不论他们的终端关联)拥有的流程,以更易于人类读取的格式。

通过使用管道,您可以使用grep搜索ps aux的输出,以返回特定过程的名称。

1ps aux | grep bash
1[secondary_label Output]
2sammy 41664 0.7 0.0 34162880 2528 s000 S 1:35pm 0:00.04 -bash
3sammy 41748 0.0 0.0 34122844 828 s000 S+    1:35pm 0:00.00 grep bash

这既返回了你刚刚运行的过程,也返回了当前运行的壳,还返回了他们的总内存和CPU使用时间,他们运行了多久,以及在上面突出的输出中,他们的 _process ID。

快速获取一个过程的PID的方法是使用pgrep命令:

1pgrep bash
1[secondary_label Output]
21017

在启动时产生的第一个过程,称为 init,得到1的PID。

1pgrep init
1[secondary_label Output]
21

这个过程随后负责在系统上的每一个其他过程的发育,后来的过程都得到更大的PID号码。

一个过程的 parent 是负责生育过程的过程,父母过程有 PPID,您可以在许多过程管理应用程序中看到列标题,包括顶部,顶部ps

用户和操作系统之间关于流程的任何通信都涉及在操作过程中某个时候在流程名称和PID之间进行翻译,这就是为什么这些实用程序将始终在输出中包含PID。

第3步:如何在Linux中发送流程信号

Linux 中的所有流程都响应 _signals. 信号是指告诉程序终止或修改其行为的一种操作系统级别的方式。

最常见的方式传递信号给一个程序是使用杀死命令,正如你所期望的那样,这个实用程序的默认功能是尝试杀死一个过程:

1kill PID_of_target_process

这将发送 TERM信号到进程中,TERM信号告诉进程请终止,这使程序能够顺利执行清理操作和输出。

如果程序行为不佳,并且在给出 TERM 信号时不会退出,您可以通过KILL信号升级信号:

1kill -KILL PID_of_target_process

这是一个特殊的信号,不会发送到程序。

相反,它被交给操作系统内核,这关闭了过程,用于绕过忽略发送给它们的信号的程序。

例如,您可以通过15而不是-TERM-9而不是-KILL

信号不仅用于关闭程序,还可以用来执行其他操作。

例如,许多旨在在背景中不断运行的流程(有时称为daemons)在收到HUP信号或 hang-up 信号时会自动重新启动。

1sudo kill -HUP pid_of_apache

上面的命令会导致Apache重新加载其配置文件并恢复服务内容。

<$>[注] **注:**许多背景流程是通过系统 services 进行管理的,这些流程提供了与它们交互的额外表面,通常最好是重新启动服务本身,而不是直接向一个运行流程发送一个HUP信号。

您可以列出所有可以发送杀死-l旗帜的信号:

1kill -l
1[secondary_label Output]
21) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
36) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
411) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM

虽然傳統的方式发送信号是通过使用PID,但也有方法可以用常规的过程名称来做到这一点。

pkill命令几乎与kill完全相同,但它使用一个过程名称:

1pkill -9 ping

上面的命令相当于:

1kill -9 `pgrep ping`

如果您想向特定流程的每个实例发送信号,您可以使用杀死命令:

1killall firefox

上面的命令会将 TERM 信号发送到计算机上运行的每个 Firefox 实例。

步骤4:如何调整流程优先级

通常,您需要调整服务器环境中优先考虑哪些流程。

某些进程可能被视为对您的情况至关重要的任务,而其他进程可能会在剩余资源时执行。

Linux 通过一个称为 niceness的值来控制优先级。

高优先级的任务被视为少于 nice,因为它们也不共享资源,而低优先级的流程则是 nice,因为它们坚持只使用最少的资源。

当你在文章开始时运行顶部,有一个标记为NI的列。

1top
 1[secondary_label Output] 
 2Tasks:  56 total, 1 running, 55 sleeping, 0 stopped, 0 zombie
 3Cpu(s):  0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
 4Mem:   1019600k total, 324496k used, 695104k free, 8512k buffers
 5Swap:        0k total, 0k used, 0k free, 264812k cached
 6
 7  PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+  COMMAND           
 8 1635 root 20 0 17300 1200 920 R 0.3 0.1 0:00.01 top                
 9    1 root 20 0 24188 2120 1300 S 0.0 0.2 0:00.56 init               
10    2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd           
11    3 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0

优良的值可以从 -19/-20 (最高优先级) 和 19/20 (最低优先级) 之间的范围,取决于系统。

若要运行某个好值的程序,您可以使用命令:

1nice -n 15 command_to_execute

只有在启动新程序时才会有效。

若要更改正在执行的程序的好值,您可以使用一个名为renice的工具:

1renice 0 PID_to_prioritize

结论

流程管理是Linux的一个基本组成部分,几乎在任何情况下都很有用,即使你没有执行任何实际的系统管理,能够追捕困扰的流程并仔细处理它们也是非常有用的。

接下来,您可能想学习如何使用netstatdu监控其他服务器资源(https://andsky.com/tech/tutorials/how-to-use-top-netstat-du-other-tools-to-monitor-server-resources)。

Published At
Categories with 技术
comments powered by Disqus