如何在 Linux 中使用 ps、kill 和 nice 等命令管理进程

搬瓦工

与任何现代计算机一样,Linux 服务器运行多个应用程序。这些被称为和管理为单独的过程。虽然 Linux 将处理进程生命周期中的低级、幕后管理——即启动、关闭、内存分配等——您将需要一种与操作系统交互的方式来管理它们 更高的水平。

在本教程中,您将了解流程管理的一些基本方面。为此,Linux 提供了许多标准的内置工具。您将在 Ubuntu 20.04 环境中探索这些想法,但任何现代 Linux 发行版都将以类似的方式运行。

一、如何在 Linux 中查看正在运行的进程

您可以使用 top 命令查看服务器上运行的所有进程:

top

输出如下:

Output
top - 15:14:40 up 46 min,  1 user,  load average: 0.00, 0.01, 0.05
Tasks:  56 total,   1 running,  55 sleeping,   0 stopped,   0 zombie
Cpu(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
Mem:   1019600k total,   316576k used,   703024k free,     7652k buffers
Swap:        0k total,        0k used,        0k free,   258976k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
    1 root      20   0 24188 2120 1300 S  0.0  0.2   0:00.56 init               
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd           
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.07 ksoftirqd/0        
    6 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0        
    7 root      RT   0     0    0    0 S  0.0  0.0   0:00.03 watchdog/0         
    8 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 cpuset             
    9 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 khelper            
   10 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kdevtmpfs

前几行输出提供了系统统计信息,例如 CPU/内存负载和正在运行的任务总数。您可以看到有 1 个正在运行的进程和 55 个被认为处于睡眠状态的进程,因为它们没有主动使用 CPU 周期。

显示输出的其余部分显示正在运行的进程及其使用情况统计信息。默认情况下,top 会自动按 CPU 使用率对这些进程进行排序,因此您可以首先看到最繁忙的进程。top 将继续在您的 shell 中运行,直到您使用标准组合键 Ctrl+C 停止它以退出正在运行的进程。这会发送一个 kill 信号,指示进程在可能的情况下优雅地停止。

大多数软件包存储库中都提供了 top 的改进版本,称为 htop。在 Ubuntu 20.04 上,您可以使用 apt 安装它:

sudo apt install htop

之后可以使用 htop 命令查看:

htop

输出如下:

Output
  Mem[|||||||||||           49/995MB]     Load average: 0.00 0.03 0.05 
  CPU[                          0.0%]     Tasks: 21, 3 thr; 1 running
  Swp[                         0/0MB]     Uptime: 00:58:11

  PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
 1259 root       20   0 25660  1880  1368 R  0.0  0.2  0:00.06 htop
    1 root       20   0 24188  2120  1300 S  0.0  0.2  0:00.56 /sbin/init
  311 root       20   0 17224   636   440 S  0.0  0.1  0:00.07 upstart-udev-brid
  314 root       20   0 21592  1280   760 S  0.0  0.1  0:00.06 /sbin/udevd --dae
  389 messagebu  20   0 23808   688   444 S  0.0  0.1  0:00.01 dbus-daemon --sys
  407 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.02 rsyslogd -c5
  408 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.00 rsyslogd -c5
  409 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.00 rsyslogd -c5
  406 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.04 rsyslogd -c5
  553 root       20   0 15180   400   204 S  0.0  0.0  0:00.01 upstart-socket-br

htop 提供更好的多 CPU 线程可视化,更好地了解现代终端中的颜色支持,以及更多排序选项等功能。 与 top 不同,它并不总是默认安装,但可以被认为是一个替代品。 您可以像使用 top 一样按 Ctrl+C 退出 htop。

二、如何使用 ps 列出进程

top 和 htop 提供了一个仪表板界面来查看正在运行的进程,类似于图形任务管理器。仪表板界面可以提供概览,但通常不会直接返回可操作的输出。为此,Linux 提供了另一个标准命令 ps 来查询正在运行的进程。

不带任何参数运行 ps 提供的信息非常少:

ps

输出如下:

Output
  PID TTY          TIME CMD
 1017 pts/0    00:00:00 bash
 1262 pts/0    00:00:00 ps

此输出显示与当前用户和终端会话关联的所有进程。如果您当前仅在此终端中运行 bash shell 和此 ps 命令,则这是有意义的。

要更全面地了解该系统上的进程,您可以运行 ps aux:

ps aux

输出如下:

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

这些选项告诉 ps 以更易于阅读的格式显示所有用户(无论其终端关联)拥有的进程。通过使用管道,您可以使用 grep 在 ps aux 的输出中进行搜索,以返回特定进程的名称。如果您认为它已经崩溃,或者如果您出于某种原因需要停止它,这将很有用。

ps aux | grep bash

输出如下:

Output
sammy         41664   0.7  0.0 34162880   2528 s000  S     1:35pm   0:00.04 -bash
sammy         41748   0.0  0.0 34122844    828 s000  S+    1:35pm   0:00.00 grep bash

这将返回您刚刚运行的 grep 进程和当前正在运行的 bash shell。它还会返回它们的总内存和 CPU 使用率、它们运行了多长时间,以及在上面突出显示的输出中,它们的进程 ID。在 Linux 和类 Unix 系统中,每个进程都分配有一个进程 ID 或 PID。这就是操作系统识别和跟踪进程的方式。

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

pgrep bash

用户和操作系统之间关于进程的任何通信都涉及在操作期间的某个时刻在进程名称和 PID 之间进行转换。这就是为什么这些实用程序总是在其输出中包含 PID。在下一节中,您将学习如何使用 PID 向正在运行的进程发送停止、恢复或其他信号。

三、如何在 Linux 中发送进程信号

Linux 中的所有进程都响应信号。信号是一种操作系统级别的方式,它告诉程序终止或修改它们的行为。向程序传递信号的最常见方式是使用 kill 命令。如您所料,此实用程序的默认功能是尝试终止进程:

kill PID_of_target_process

这会将 TERM 信号发送到进程。TERM 信号告诉进程请终止。这样可以让程序进行清理操作并顺利退出。如果程序运行不正常并且在给出 TERM 信号时没有退出,您可以通过传递 KILL 信号来升级信号:

kill -KILL PID_of_target_process

这是一个特殊的信号,不会发送给程序。相反,它被提供给操作系统内核,从而关闭进程。这用于绕过忽略发送给它们的信号的程序。

每个信号都有一个关联的数字,可以代替名称传递。 例如,您可以传递“-15”而不是“-TERM”,以及“-9”而不是“-KILL”。

信号不仅用于关闭程序。 它们也可用于执行其他操作。例如,许多设计为在后台持续运行的进程(有时称为“守护进程”)会在收到 HUP 或挂断信号时自动重启。Apache 网络服务器通常以这种方式运行。

sudo kill -HUP pid_of_apache

上述命令将导致 Apache 重新加载其配置文件并恢复提供内容。

您可以使用 -l 标志列出所有可能与 kill 一起发送的信号:

kill -l

虽然发送信号的传统方式是通过使用 PID,但也有使用常规进程名称执行此操作的方法。

pkill 命令的工作方式几乎与 kill 完全相同,但它对进程名称进行操作:

pkill -9 ping

上面的命令等效于:

kill -9 `pgrep ping`

如果你想向某个进程的每个实例发送一个信号,你可以使用 killall 命令:

killall firefox

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

四、如何调整进程优先级

通常,您会想要调整在服务器环境中赋予哪些进程优先权。某些流程可能被认为对您的情况至关重要,而其他流程可能会在有剩余资源时执行。Linux 通过一个叫做 niceness 的值来控制优先级。高优先级任务被认为不太好,因为它们也不共享资源。另一方面,低优先级进程很好,因为它们坚持只占用最少的资源。

当你在文章开头跑到top的时候,有一个标有“NI”的栏目。这是该过程的不错的价值:

[secondary_label Output] 
Tasks:  56 total,   1 running,  55 sleeping,   0 stopped,   0 zombie
Cpu(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
Mem:   1019600k total,   324496k used,   695104k free,     8512k buffers
Swap:        0k total,        0k used,        0k free,   264812k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND           
 1635 root      20   0 17300 1200  920 R  0.3  0.1   0:00.01 top                
    1 root      20   0 24188 2120 1300 S  0.0  0.2   0:00.56 init               
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd           
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.11 ksoftirqd/0

Nice 值的范围在 -19/-20(最高优先级)和 19/20(最低优先级)之间,具体取决于系统。要以某个 nice 值运行程序,可以使用 nice 命令:

nice -n 15 command_to_execute

这仅在开始新程序时有效。要更改已在执行的程序的 nice 值,您可以使用名为 renice 的工具:

renice 0 PID_to_prioritize

进程管理是 Linux 的基本组成部分,几乎在所有情况下都有用。即使您没有执行任何实际的系统管理,能够追踪卡住的进程并小心处理它们也非常有帮助。

五、搬瓦工新手教程和优惠套餐

1、搬瓦工新手入门

  1. 搬瓦工新手入门教程(1):搬瓦工众多方案怎么选择
  2. 搬瓦工新手入门教程(2):搬瓦工机房选择和速度测试
  3. 搬瓦工新手入门教程(3):注册账户和微信支付、支付宝购买教程
  4. 搬瓦工新手入门教程(4):登陆搬瓦工网站后台查看 VPS,登录 KiwiVM 面板进行简单管理
  5. 搬瓦工新手入门教程(5):通过 KiwiVM 后台面板更换操作系统并获取登陆信息

2、搬瓦工推荐方案

优惠码:BWHCCNCXVV(优惠力度 6.58%)

更多推荐:

方案内存CPU硬盘流量/月带宽机房价格购买
KVM
(最便宜)
1GB2核20GB1TB1GbpsDC3 CN2
DC8 ZNET
$49.99/年购买
KVM2GB3核40GB2TB1Gbps$52.99/半年
$99.99/年
购买
CN2GIA-E
(最推荐)
1GB2核20GB1TB2.5GbpsDC6 CN2 GIA-E
DC9 CN2 GIA
日本软银 JPOS_1
荷兰 EUNL_9
$49.99/季度
$169.99/年
购买
CN2GIA-E2GB3核40GB2TB2.5Gbps$89.99/季度
$299.99/年
购买
HK2GB2核40GB0.5TB1Gbps中国香港 CN2 GIA
日本东京 CN2 GIA
$89.99/月
$899.99/年
购买
HK4GB4核80GB1TB1Gbps$155.99/月
$1559.99/年
购买
OSAKA2GB2核40GB0.5TB1.5Gbps日本大阪 CN2 GIA$49.99/月
$499.99/年
购买
OSAKA4GB4核80GB1TB1.5Gbps$86.99/月
$869.99/年
购买

此外,也可以参考《2022年最新搬瓦工优惠码/搬瓦工便宜套餐/搬瓦工新手教程整理》。

未经允许不得转载:搬瓦工 » 如何在 Linux 中使用 ps、kill 和 nice 等命令管理进程