当前位置: 首页>>技术问答>>正文


Ctrl-C不会中止正在运行的作业时该怎么办?

, , ,

问题描述

有时候,进程忽略Bash中CtrlC发送的SIGINT信号。例如,manvi。假设你不想谷歌或阅读关于如何退出正在运行的过程的手册,是否有任何键序列将始终工作(不离开终端)?

最佳解决思路

Ctrl + \发送SIGQUIT信号。

.. $ sleep 10
^\Quit

→这相当于kill -3 pid。在user-space中运行的程序不会忽略sigquit。

还有一套Magic SysRq键盘快捷键。其中一个更有趣的是:Alt + SysRq + k。它会杀死当前虚拟控制台上的每个进程。如果你的某个ttys完全被彻底打破了,这可以用来回归。在运行X.org的tty上,它可以用来毫不留情地杀死X.

SysRq键在大多数键盘上与打印键相同。在我的笔记本上,可以使用Fn键调用它;即Alt→Fn→依次打印→k。

以下是一些基本的流程管理快捷方式:

  • Ctrl + Z:暂停一个进程(加上bg在后台恢复,fg升至前台)

  • Ctrl + C:礼貌地要求流程立即关闭

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

  • Alt + SysRq + s:将数据写入磁盘(在杀死任何重要内容之前,请务必执行此操作)

  • Alt + SysRq + sk:无情地终止给定虚拟控制台上的所有当前进程

  • Alt + SysRq + sb:无须重新启动而无需卸载,

  • Alt + SysRq + reisub:即使系统完全损坏,也可以安全地重新启动,

注意:与Ctrl + C和Ctrl + \相比,Ctrl + Z也适用于man,vi,less等。

如有疑问,以下程序几乎总是有效的:

~$ sleep 10
^Z
[5]+  Stopped              sleep 10
~$ ps
  PID TTY          TIME CMD
 4804 pts/0    00:00:00 bash
 6207 pts/0    00:00:00 sleep
 6208 pts/0    00:00:00 ps
~$ kill -9 6207
[5]+  Killed                  sleep 10
~$ 

^ Z当然表示Ctrl + Z已被按下。


对于更多的in-depth看看壳和终端,也请看我的答案:


此答案中的mistakeJuliano更正。

次佳解决思路

您可以尝试Ctrl + \

第三种解决思路

有时CTRL+C会发送到错误的节目或输入频道。对于诸如vi之类的编辑器来说,这尤其常见,带有管道输出的命令,涉及循环的复杂bash命令等等。

一个简单而快速的解决方案是暂停工作CTRL+Z,然后通过作业号kill %1kill -9 %1等杀死它。

第四种思路

要退出,请使用q要离开vi使用:q

第五种思路

  • 尝试以下方法之一:Ctrl + 4 Ctrl + \


  • 或者:Ctrl + Z然后运行:kill %1

%1是按下ControlZ时返回的作业编号。添加-9强制杀死。


当您在文本控制台中时,您还可以尝试:CtrlSysRq。内核应该终止进程。

SysRqk,杀死当前虚拟控制台上的所有进程(也可以杀死X和svgalib程序)。

Note: When magic SysRq keys are used to kill a frozen graphical program, the program has no chance to restore text mode. This can make everything unreadable.

请参阅:Magic SysRq key and its command combinations.

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/794.html,未经允许,请勿转载。