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

使用任何计算机系统时,过程管理是一项基本技能。在管理服务器环境时尤其如此。本文将介绍一些可用于管理Linux系统上的进程的强大工具。

介绍


Linux服务器像您可能熟悉的任何其他计算机一样运行应用程序。 对于计算机,这些被认为是“过程”。

虽然Linux将在一个进程的生命周期中处理低级的幕后管理,但是您需要一种与操作系统交互的方式,以便从更高级别管理它。

在本指南中,我们将讨论过程管理的一些简单方面。 Linux为此提供了丰富的工具集合。

我们将在Ubuntu 12.04 VPS上探索这些想法,但任何现代Linux发行版都将以类似的方式运行。

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


最佳


找出哪些进程正在运行在服务器上的最简单方法是运行top的命令:

top

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          

顶部的信息块提供系统统计信息,例如系统负载和任务总数。

你可以很容易地看到有1个正在运行的进程,55个进程正在休眠(也称为空闲/不使用CPU资源)。

底部具有正在运行的进程及其使用统计信息。

htop


改进版top ,称为htop ,是存储库中可用。 使用此命令安装:

sudo apt-get install htop

如果我们运行htop命令,我们会看到,有一个更人性化的显示器:

htop

  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在这里。

如何使用ps列出进程


这两个tophtop提供一个漂亮的界面,以查看正在运行的类似于图形任务管理器的进程。

然而,这些工具并不总是足够灵活,足以涵盖所有情况。 所谓功能强大的命令ps往往是回答这些问题。

当无参数调用时,输出可能有点缺乏:

ps

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

此输出显示与当前用户和终端会话相关联的所有进程。 这是有道理的,因为我们只运行bashps这个终端当前。

为了更全面地了解本系统上的进程,我们可以运行以下命令:

ps aux

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展现在用户友好的格式由所有用户拥有(无论其终端联合体)的进程。

要查看树状视图 ,层级关系所示,我们可以运行这些选项下面的命令:

ps axjf

 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    0     2     0     0 ?           -1 S        0   0:00 [kthreadd]
    2     3     0     0 ?           -1 S        0   0:00  \_ [ksoftirqd/0]
    2     6     0     0 ?           -1 S        0   0:00  \_ [migration/0]
    2     7     0     0 ?           -1 S        0   0:00  \_ [watchdog/0]
    2     8     0     0 ?           -1 S<       0   0:00  \_ [cpuset]
    2     9     0     0 ?           -1 S<       0   0:00  \_ [khelper]
    2    10     0     0 ?           -1 S        0   0:00  \_ [kdevtmpfs]
    2    11     0     0 ?           -1 S<       0   0:00  \_ [netns]
. . .

如可以看到,该方法kthreadd被示为是的父ksoftirqd/0过程和其他。

有关进程ID的注意事项


在Linux和Unix系统中,每个进程被分配一个进程ID,PID。 这就是操作系统如何识别和跟踪进程。

得到一个进程的PID的快速方法是使用pgrep命令:

pgrep bash

1017

这将简单地查询进程ID并返回它。

在引导衍生所述第一进程是init,被赋予“1”的PID。

pgrep init

1

然后,此进程负责生成系统上的每个其他进程。 给较后的过程较大的PID数。

一个进程的是负责产卵它的进程。 如果进程的父进程被杀死,那么子进程也会死亡。 父进程的PID被称为PPID。

你可以看到在许多流程管理应用程序,包括列标题PID和PPID tophtopps

用户和操作系统之间关于进程的任何通信涉及在操作期间的某个时刻在进程名称和PID之间进行转换。 这就是为什么公用程序告诉你PID。

如何在Linux中发送进程信号


在Linux中的所有进程响应信号 信号是一种os级别的方式来告诉程序终止或修改他们的行为。

如何通过PID发送过程信号


传递信号以程序的最常见的方法是使用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重新加载其配置文件并恢复服务内容。

您可以通过键入列出所有可能与kill发送的信号:

kill -l

1) 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信号。

如何调整流程优先级


通常,您需要调整在服务器环境中哪些进程被赋予优先级。

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

Linux的通过一个名为值控制正派优先。

高优先级任务被认为不太好听 ,因为它们不共享资源。 低优先级的进程,在另一方面,由于他们坚持只以最少的资源都不错

当我们跑top在文章的开头,出现了标有“NI”一列。 这是进程的nice值:

top

 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

注意:当nice根据需要使用命令名称时,renice通过调用进程PID来操作

结论


过程管理是新用户有时难以掌握的主题,因为所使用的工具与其图形对应方不同。

然而,这些想法是熟悉和直观的,有一点练习,将变得自然。 因为进程涉及到你对计算机系统所做的一切,所以学习如何有效地控制它们是一项基本技能。

作者:Justin Ellingwood