Ctrl + C 无法杀死进程怎么办?

Dus*_*ell 202 linux bash shell

Ctrl+C并不总是可以杀死当前进程(例如,如果该进程在某些网络操作中很忙)。在这种情况下,您只能通过光标看到“^C”而不能做其他事情。

在不丢失终端的情况下强制该进程立即终止的最简单方法是什么?

答案总结: 通常,您可以Ctrl+Z将进程置于睡眠状态,然后执行kill -9 _process-pid_,在那里您可以使用ps和其他工具找到进程的 pid 。在Bash(也可能是其他 shell)上,您可以kill -9 %1(或一般情况下使用 '%N'),这更容易。如果Ctrl+Z不起作用,您将不得不打开另一个终端并从那里杀死

aki*_*ira 137

要了解为什么Ctrl+C不起作用的问题,了解按下它时会发生什么非常有帮助:

大多数 shell 绑定Ctrl+C以“向当前在前台运行的程序发送SIGINT信号”。您可以通过man signal了解不同的信号

 SIGINT        2       Term    Interrupt from keyboard
Run Code Online (Sandbox Code Playgroud)

程序可以忽略该信号,因为它们也可以忽略SIGTSTP

 SIGTSTP   18,20,24    Stop    Stop typed at tty
Run Code Online (Sandbox Code Playgroud)

(这是大多数 shell 在您按下Ctrl+时所做的事情Z,这就是它不能保证工作的原因。)

有一些信号不能被进程忽略:SIGKILLSIGSTOP和其他一些。您可以通过kill命令发送这些信号。因此,要终止挂起/僵尸进程,只需找到进程 ID (PID)。例如,使用pgreporps然后kill它:

 % kill -9 PID
Run Code Online (Sandbox Code Playgroud)

  • 一句话。请注意,“zombie”在技术上是一个进程状态,它与您在这里所说的“zombieying”不同。(一个没有被其父进程 wait() 处理的终止进程处于僵尸(`Z`)状态。在这种情况下,它不能再处理信号。) (14认同)

Ted*_*ddy 127

如果Ctrl+ C(SIGINT) 不起作用,请尝试Ctrl+ \(SIGQUIT)。然后尝试Ctrl+ Z(SIGTSTP)。如果这使您返回到 shell 提示符,请kill对进程 ID 执行操作。(默认为SIGTERM信号,您可以用指定kill -TERM。在一些炮弹,你可以使用%1来指代PID)。如果不工作,去到另一个终端或SSH会话并做killkill -TERM上进程标识。 只有作为最后的手段,你应该这样做kill -KILL,也就是kill -9,因为它不会给进程任何机会彻底中止、同步其打开的文件、删除其临时文件、关闭网络连接等。


小智 46

也请参阅此链接

Ctrl+ Z:暂停进程。

Ctrl+ C:礼貌地要求进程立即关闭。

Ctrl+ \: 无情地杀死当前在前台的进程

  • 您对 Ctrl+\ 的描述不准确。这会发送一个 SIGQUIT,它*不一定*会终止进程,而且肯定不会“无情地”终止。它*通常*会在触发[核心转储](https://en.wikipedia.org/wiki/Signal_(IPC)#SIGQUIT)后这样做。然而,如果一个进程忽略 SIGINT,那么它也完全有可能忽略 SIGQUIT。SIGQUIT 并没有什么“无情”之处;你正在考虑 SIGKILL。 (8认同)
  • `"ctrl"`+`"\"` 对我不起作用 (6认同)

Dan*_*eck 33

按 Ctrl-Z暂停程序并将其置于后台

Suspend the program currently running and put it in the background.
This does not stop the process as it does in VMS!
Run Code Online (Sandbox Code Playgroud)

(再次使用 恢复到前台fg

然后,您可以killkill -9它,给定它的进程 ID(您从 中获得ps a)。

  • 使用 bash 你可以`kill $!`,因为`$!` 是一个特殊的变量,包含最后一个后台程序的 pid。 (13认同)
  • @丹尼尔,正确。正如我所说的最后一个_backgrounded_进程,因此在Ctrl + Z之后需要`bg`,它只是暂停。 (2认同)
  • 注意:这不仅仅是一个技巧,如果你有多个同名进程在运行,使用 `ps` 输出(或 `killall`)是非常危险的。`ps -e -o pid,command` 将提供 pid+full args,而不仅仅是程序名称,但同样可能不足以区分。相比之下,`$!` 是一个肯定的打击。 (2认同)

Oll*_*lli 13

通常,您仍然可以停止进程 ( Ctrl+ Z),然后使用kill -9. 对于kill -9,您首先需要进程 PID。对于后台作业,这kill -9 %1是最简单的方法 - 如果您不确定要终止的后台作业数量,请运行jobs.

或者,您可以使用以下命令找到进程 ID

ps
Run Code Online (Sandbox Code Playgroud)

然后你可以运行

kill -9 <Appropriate PID from ps output>
Run Code Online (Sandbox Code Playgroud)


Lin*_*000 5

1) 如果您在控制台上并处于多用户模式,您可以按 CTRL-ALT-Fn 并在另一个屏幕上登录,使用ps -ef | grep <myprocessname>pidof <myprocessname>然后通过 ID 号杀死 -9 进程。

2) 如果您是远程连接,请通过另一个终端会话执行相同的操作。

您还可以通过安装htop让生活变得更轻松,它是 top 的更通用版本,允许您有选择地终止正在运行的进程。大多数发行版在存储库中都有 htop。

3) 如果您刚刚陷入挂起的 ssh 会话(例如,连接到另一个系统),请尝试按波浪号 (~),这是转义键,然后按 CTRL-Z 返回到主机会话,然后您可以终止卡住的 ssh 进程或等待其超时,这在一段时间不活动后大多数人都会这样做。


Dus*_*ell 5

Bash(和其他 shell?)的一个更简单的解决方案是:

Ctrl-z      followed by     kill -9 %1
Run Code Online (Sandbox Code Playgroud)

其中“%1”是指被杀死的作业号。如果您已经有其他工作在休眠,则它可能是“%2”(或其他)。当您按 Ctrl-z 时,您可以看到它是哪个作业编号:

[1]+  Stopped                 <process name>
Run Code Online (Sandbox Code Playgroud)

请注意,'kill' 是 shell 版本的 kill,而不是 /bin/kill。