怎样在 Linux 命令行下杀死一个进程

Jack Wallen 的头像

·

·

·

30,586 次阅读

Linux 的命令行里面有用来停止正在运行的进程的所有所需工具。Jack Wallen 将为您讲述细节。

stop processes

想像一下:你打开了一个程序(可能来自于你的桌面菜单或者命令行),然后开始使用这个程序,没想到程序会锁死、停止运行、或者意外死机。你尝试再次运行该程序,但是它反馈说原来的进程没有完全关闭。

你该怎么办?你要结束进程。但该如何做?不管你信与不信,最好的解决方法大都在命令行里。值得庆幸的是, Linux 有供用户杀死错误的进程的每个必要的工具,然而,你在执行杀死进程的命令之前,你首先需要知道进程是什么。该如何处理这一类的任务。一旦你能够掌握这种工具,它实际是十分简单的……

让我来介绍给你这些工具。

我来概述的步骤是每个 Linux 发行版都能用的,不论是桌面版还是服务器版。我将限定只使用命令行,请打开你的终端开始输入命令吧。

定位进程

杀死一个没有响应的进程的第一个步骤是定位这个进程。我用来定位进程的命令有两个:topps 命令。top 是每个系统管理员都知道的工具,用 top 命令,你能够知道到所有当前正在运行的进程有哪些。在命令行里,输入 top 命令能够就看到你正在运行的程序进程(图1)

top

图 1: top 命令给出你许多的信息。

从显示的列表中你能够看到相当重要的信息,举个例子,Chrome 浏览器反映迟钝,依据我们的 top 命令显示,我们能够辨别的有四个 Chrome 浏览器的进程在运行,进程的 pid 号分别是 3827、3919、10764 和 11679。这个信息是重要的,可以用一个特殊的方法来结束进程。

尽管 top 命令很是方便,但也不是得到你所要信息最有效的方法。 你知道你要杀死的 Chrome 进程是那个,并且你也不想看 top 命令所显示的实时信息。 鉴于此,你能够使用 ps 命令然后用 grep 命令来过滤出输出结果。这个 ps 命令能够显示出当前进程列表的快照,然后用 grep 命令输出匹配的样式。我们通过 grep 命令过滤 ps 命令的输出的理由很简单:如果你只输入 ps 命令,你将会得到当前所有进程的列表快照,而我们需要的是列出 Chrome 浏览器进程相关的。所以这个命令是这个样子:

ps aux | grep chrome

这里 aux 选项如下所示:

  • a = 显示所有用户的进程
  • u = 显示进程的用户和拥有者
  • x = 也显示不依附于终端的进程

当你搜索图形化程序的信息时,这个 x 参数是很重要的。

当你输入以上命令的时候,你将会得到比图 2 更多的信息,而且它有时用起来比 top 命令更有效。

ps command

图 2:用 ps 命令来定位所需的内容信息。

结束进程

现在我们开始结束进程的任务。我们有两种可以帮我们杀死错误的进程的信息。

  • 进程的名字
  • 进程的 ID (PID)

你用哪一个将会决定终端命令如何使用,通常有两个命令来结束进程:

  • kill – 通过进程 ID 来结束进程
  • killall – 通过进程名字来结束进程

有两个不同的信号能够发送给这两个结束进程的命令。你发送的信号决定着你想要从结束进程命令中得到的结果。举个例子,你可以发送 HUP(挂起)信号给结束进程的命令,命令实际上将会重启这个进程。当你需要立即重启一个进程(比如就守护进程来说),这是一个明智的选择。你通过输入 kill -l 可以得到所有信号的列表,你将会发现大量的信号。

图 3: 可用的结束进程信号。

最经常使用的结束进程的信号是:

Signal NameSingle ValueEffect

via: https://www.linux.com/learn/intro-to-linux/2017/5/how-kill-process-command-line

作者:JACK WALLEN 译者:hwlog 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

3 条回复

  1. 来自四川成都的 Chrome 58.0|GNU/Linux 用户 的头像
    来自四川成都的 Chrome 58.0|GNU/Linux 用户

    kill 依据具体的版本(比如 kill from util-linux 2.28.2) ,支持参数为 processname,而 Ubuntu 带的 kill,则不支持,需要配合 pidof。

    来自成都
  2. 来自浙江嘉兴的 Chrome 58.0|GNU/Linux 用户 的头像
    来自浙江嘉兴的 Chrome 58.0|GNU/Linux 用户

    咦, kill不是procps包的么,啥时候属于util-linux包的呢??话说我的kill还是个shell-builtin的呢~~

    来自杭州
  3. 来自四川成都的 Chromium 58.0|Ubuntu 用户 的头像
    来自四川成都的 Chromium 58.0|Ubuntu 用户

    不同发行版,文件所属包不同,正常。显然这是指外部命令。

    来自成都

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注