Ctrl + C并不总是可以杀死当前进程(例如,如果该进程在某些网络操作中很忙)。在这种情况下,您只需在光标处看到“ ^ C”,就无能为力了。

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

答案的摘要:
通常,您可以按Ctrl + Z来使进程进入休眠状态,然后执行kill -9 _process-pid_,在此您可以使用ps和其他工具找到进程的pid。
在Bash(可能还有其他shell)上,您可以执行kill -9 %1(或通常为'%N'),这更加容易。如果Ctrl + Z键不起作用,则必须打开另一个终端并从那里终止。

评论

屏幕可能是一种解决方案,它允许您创建一个新窗口并从此处终止该进程。

假设您已经在屏幕上:)

#1 楼

要了解为什么Ctrl + C无法正常工作的问题,了解按一下它会发生什么非常有帮助:

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

 SIGINT        2       Term    Interrupt from keyboard


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

 SIGTSTP   18,20,24    Stop    Stop typed at tty


(按Ctrl + Z时,大多数shell都会执行此操作,因此不能保证它能正常工作。)

有些信号不能被进程忽略:SIGKILL,SIGSTOP等。您可以通过kill命令发送这些信号。因此,要杀死您的挂起/僵尸进程,只需找到进程ID(PID)。例如,使用pgrepps,然后使用kill

 % kill -9 PID


评论


仅此而已。请注意,“僵尸”从技术上讲是一种过程状态,它与您在此处所说的“僵尸”并不相同。 (尚未由其父节点等待(终止)的终止进程处于僵尸(Z)状态。在这种情况下,它无法再处理信号。)

–StéphaneGimenez
2011-09-19 14:15



遗憾的是,有时ctrl + c,ctrl + z和ctrl + \都不执行任何操作,并且该进程正在运行undo sudo(允许无密码),因此您不能只是向该进程发送信号。

–迈克尔
18年1月30日在19:50

#2 楼

如果Ctrl + C(SIGINT)不起作用,请尝试按Ctrl + \(SIGQUIT)。然后尝试按Ctrl + Z(SIGTSTP)。如果返回到外壳提示符,请对进程ID执行kill。 (这默认为SIGTERM信号,您可以使用kill -TERM来指定。在某些Shell中,您可能可以使用%1来引用PID。)如果不起作用,请转到另一个终端或SSH会话并执行kill或在进程ID上为kill -TERM。只有在万不得已时才可以执行kill -KILL,也就是kill -9,因为它不会使进程有任何机会中止清理,同步其打开的文件,删除其临时文件,关闭网络连接等。

#3 楼

也请参阅此链接。

Ctrl + Z:暂停进程。

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

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

评论


“ ctrl” +“ \”对我不起作用

–本雅明·贾法里(Benyamin Jafari)
19年1月2日在7:26



您对Ctrl + \的描述不正确。这会发送一个SIGQUIT,它不一定会终止进程,当然也不会“毫不留情”。触发核心转储后,通常会这样做。但是,如果某个进程忽略了SIGINT,那么它完全是合理的,它也会忽略SIGQUIT。 SIGQUIT没有什么“残酷”的。您正在考虑SIGKILL。

– dimo414
20年6月19日在22:06

#4 楼

按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还原到前台)

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

评论


使用bash可以杀死$ !,就像杀死$!一样。是一个特殊变量,包含最后一个后台程序的pid。

– Lloeki
2011年2月9日在12:58

@Lloeki对我不起作用(至少不可靠)。在变量获得赋值之前,我必须进行一次bg操作。

–丹尼尔·贝克♦
2011-2-9 13:10



@丹尼尔,对。就像我说的最后一个后台进程,因此在Ctrl + Z之后需要bg才将其挂起。

– Lloeki
2011年2月9日在13:22

注意:这不只是一个技巧,如果您有多个运行相同名称的进程,则使用ps输出(或killall)是很有风险的。 ps -e -o pid,命令将提供pid + full args,不仅提供程序名,而且可能还不足以区分。相反,$!肯定会成功。

– Lloeki
2011-2-9 14:07在

@Lloeki我不同意。我的系统上ps a的示例输出行:27721 s000 T 0:00.09 top您在同一tty(s000)中运行了多少个相同命令(顶部)的挂起(T,我认为)实例?

–丹尼尔·贝克♦
2011年2月9日在17:30



#5 楼

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

ps


然后就可以运行

kill -9 <Appropriate PID from ps output>


#6 楼

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

Ctrl-z      followed by     kill -9 %1


其中'%1'表示被杀死的作业号。如果您已经有其他作业处于休眠状态,则可能是'%2'(或其他)。当您按Ctrl-z时,您可以看到它是哪个作业号:

[1]+  Stopped                 <process name>


请注意,“ kill”是shell的kill版本,不是/ bin / kill。

#7 楼

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

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

通过安装htop,您还可以使生活更轻松一些,它是top的一种更通用的版本,它允许您有选择地终止正在运行的进程。大多数发行版在回购中都有htop。

3)如果您只是陷入挂起的ssh会话(例如,连接到另一个系统),请尝试按代号(〜),这是转义键,然后按CTRL-Z退回到主机会话,然后您可以杀死卡住的ssh进程或等待它超时,这在一段时间的不活动之后大多数仍然如此。

#8 楼

如果您正在使用tmux或screen,但上述方法均无效,则仍然可以通过<prefix> x杀死窗格,然后该进程也将被杀死。

#9 楼

/ etc / profile中可能有一个设置为SIGINT(2)的陷阱。如果是这样,请将其删除。注销并重新登录,您应该会很好。