2011-02-09 08:49:24 +0000 2011-02-09 08:49:24 +0000
183
183

当Ctrl+C不能杀死一个进程时,该怎么办?

Ctrl+C不一定能杀死当前进程(比如说,如果那个进程在某些网络操作中很忙的话)。在这种情况下,你只是看到光标旁的"^C",其他的事情就不能做了。

有什么最简单的方法可以在不丢失我的终端的情况下,强迫那个进程现在死掉?

答案汇总:通常情况下,你可以按Ctrl + Z让进程进入休眠状态,然后做kill -9 _process-pid_,在这里你可以用ps等工具找到进程的pid。在Bash上(可能还有其他的shell),你可以用kill -9 %1(或’%N'一般情况下),这样更容易。如果Ctrl + Z不起作用,你必须打开另一个终端,然后从那里kill

答案 (9)

127
127
127
2011-02-09 09:13:54 +0000

要理解为什么Ctrl + C不能工作的问题,理解按下它时发生的事情是非常有帮助的:

大多数shells绑定Ctrl + C是为了 “向当前在前台运行的程序发送一个SIGINT信号"。你可以通过man signal 来了解不同的信号:

SIGINT 2 Term Interrupt from keyboard

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

SIGTSTP 18,20,24 Stop Stop typed at tty

(这是大多数shells在按Ctrl + Z时的做法,这也是为什么不能保证它能正常工作的原因。)

还有一些信号是不能被进程忽略的。SIGKILL](http://en.wikipedia.org/wiki/Unix_signal#SIGKILL),[SIGSTOP](http://en.wikipedia.org/wiki/Unix_signal#SIGSTOP) 和其他一些信号。你可以通过 kill 命令发送这些信号。因此,要杀死挂起的进程,只需找到 进程 ID (PID)。例如,使用pgrepps,然后kill

% kill -9 PID
```。
119
119
119
2011-02-09 09:36:15 +0000

如果Ctrl+C (SIGINT)不起作用,请尝试Ctrl+C (SIGQUIT)。然后试试Ctrl+Z (SIGTSTP)。如果返回到shell提示符,在进程ID上执行kill。(这默认为SIGTERM信号,你可以用kill -TERM来指定。在某些shell中,你可能可以使用%1来引用PID。) 如果没有用,请转到另一个终端或SSH会话,然后在进程ID上执行killkill -TERM。**只有在不得已的情况下才应该执行kill -KILL,也就是kill -9,因为它不会给进程任何机会干净地中止、同步打开的文件、删除临时文件、关闭网络连接等。

37
37
37
2012-06-19 03:03:03 +0000

Ctrl+Z:暂停一个进程。

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

33
33
33
2011-02-09 08:53:17 +0000

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

Suspend the program currently running and put it in the background.
This does not stop the process as it does in VMS!

(使用fg再次恢复到前台)

然后,你可以killkill -9它,给定它的进程ID(你可以从ps a中得到这个ID)。

13
13
13
2011-02-09 08:53:41 +0000

通常情况下,你仍然可以停止进程(Ctrl + Z),然后使用kill -9。对于kill -9,你需要先用【进程PID】(http://en.wikipedia.org/wiki/Process_identifier)。对于后台作业,`kill -9 %1是最简单的方法--如果你不确定你要杀死的后台作业的数量是多少,请运行jobs`。

5
5
5
2011-02-09 22:40:53 +0000

对于Bash(和其他shells?)来说,一个更简单的解决方案是:

Ctrl-z followed by kill -9 %1

,其中"%1 “指的是被杀死的作业编号。如果你已经有其他的作业在睡觉,可能是’%2'(或者其他的东西)。当你按Ctrl-z键时,你可以看到是哪个作业编号:

[1]+ Stopped <process name>

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

4
4
4
2011-02-09 09:01:45 +0000

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

3) 如果你只是卡在一个挂着的ssh会话中(例如,到另一个系统),可以尝试按tilde (~),也就是转义键,然后按CTRL-Z返回到主机会话,然后你可以杀死被卡住的ssh进程或者等待它超时,大多数的ssh进程在一段时间不活动后都会这样做。

0
0
0
2017-04-18 10:41:06 +0000

如果你用的是tmux或者屏幕,上面的都不行,还可以通过<prefix> x杀死窗格,那么这个过程也会被杀死。

0
0
0
2017-10-26 13:16:30 +0000

在你的/etc/profile中可能有一个带有SIGINT(2)的陷阱。如果是的话,请将其删除。登出并重新登录,应该就可以了。