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

来自菜鸟教程
跳转至:导航、​搜索

介绍

与任何现代计算机一样,Linux 服务器运行多个应用程序。 这些被称为单独的 进程 并进行管理。

虽然 Linux 将处理进程生命周期中的低级幕后管理(即启动、关闭、内存分配等),但您将需要一种与操作系统交互的方式来管理它们更高的水平。

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

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

第 1 步 – 如何在 Linux 中查看正在运行的进程

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

top
Outputtop - 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 个进程被认为是 sleeping,因为它们没有主动使用 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 不同,它并不总是默认安装,但可以被视为直接替换。 您可以通过按 Ctrl+C 退出 htop,就像使用 top。 您还可以了解更多关于如何使用top和htop

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

第 2 步 – 如何使用 ps 列出进程

tophtop 提供了一个仪表板界面来查看正在运行的进程,类似于图形任务管理器。 仪表板界面可以提供概览,但通常不会返回直接可操作的输出。 为此,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
OutputUSER       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 以更易于阅读的格式显示所有用户拥有的进程(无论他们的终端关联如何)。

通过使用管道,您可以使用 grepps aux 的输出中搜索,以返回特定进程的名称。 如果您认为它已经崩溃,或者由于某种原因需要停止它,这将很有用。

ps aux | grep bash
Outputsammy         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 系统中,每个进程都分配有一个 进程 IDPID。 这就是操作系统识别和跟踪进程的方式。

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

pgrep bash
Output1017

启动时产生的第一个进程,称为 init,其 PID 为“1”。

pgrep init
Output1

然后,该进程负责生成系统上的所有其他进程。 后面的进程被赋予更大的 PID 编号。

进程的 parent 是负责生成它的进程。 父进程有一个 PPID,您可以在许多进程管理应用程序的列标题中看到它,包括 tophtopps

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

第 3 步 – 如何在 Linux 中发送进程信号

Linux 中的所有进程都响应 信号。 信号是一种操作系统级别的方法,用于告诉程序终止或修改其行为。

将信号传递给程序的最常用方法是使用 kill 命令。 如您所料,此实用程序的默认功能是尝试终止进程:

kill PID_of_target_process

这会将 TERM 信号发送到进程。 TERM 信号告诉进程请终止。 这允许程序执行清理操作并顺利退出。

如果程序行为异常并且在给出 TERM 信号时没有退出,您可以通过传递 KILL 信号来升级信号:

kill -KILL PID_of_target_process

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

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

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

信号不仅用于关闭程序。 它们还可用于执行其他操作。

例如,许多设计为在后台持续运行的进程(有时称为“守护进程”)在收到 HUPhang-up 信号时会自动重启。 Apache 网络服务器通常以这种方式运行。

sudo kill -HUP pid_of_apache

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

注意: 很多像这样的后台进程是通过系统 services 管理的,它为与它们交互提供了额外的表面,通常最好重新启动服务本身而不是发送 [X240X ] 直接向一个正在运行的进程发送信号。 如果您查看各种服务的配置文件,您可能会发现各种 service restart 钩子正是为了做到这一点而设计的——向特定进程发送信号——同时还提供日志和其他报告。


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

kill -l
Output1) SIGHUP    2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
6) SIGABRT   7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM

尽管发送信号的传统方式是使用 PID,但也有使用常规进程名称的方法。

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

pkill -9 ping

上面的命令相当于:

kill -9 `pgrep ping`

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

killall firefox

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

第 4 步 – 如何调整流程优先级

通常,您需要调整在服务器环境中哪些进程具有优先权。

对于您的情况,某些进程可能被认为是关键任务,而其他进程可能会在有剩余资源时执行。

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

高优先级任务被认为不太 nice,因为它们也不共享资源。 另一方面,低优先级进程是nice,因为它们坚持只占用最少的资源。

当你在文章开头运行top时,有一列标有“NI”。 这是进程的 nice 值:

top
[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 的一个基本部分,几乎在所有情况下都有用。 即使您没有执行任何实际操作的系统管理,能够追踪卡住的进程并小心处理它们也是非常有帮助的。

接下来,您可能想学习如何使用netstatdu监控其他服务器资源