问题描述
有时候,进程忽略Bash中Ctrl
– C
发送的SIGINT信号。例如,man
和vi
。假设你不想谷歌或阅读关于如何退出正在运行的过程的手册,是否有任何键序列将始终工作(不离开终端)?
最佳解决思路
用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
+s
,k
:无情地终止给定虚拟控制台上的所有当前进程 -
Alt
+SysRq
+s
,b
:无须重新启动而无需卸载, -
Alt
+SysRq
+r
,e
,i
,s
,u
,b
:即使系统完全损坏,也可以安全地重新启动,
注意:与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看看壳和终端,也请看我的答案:
次佳解决思路
您可以尝试Ctrl
+ \
第三种解决思路
有时CTRL+C
会发送到错误的节目或输入频道。对于诸如vi
之类的编辑器来说,这尤其常见,带有管道输出的命令,涉及循环的复杂bash命令等等。
一个简单而快速的解决方案是暂停工作CTRL+Z
,然后通过作业号kill %1
或kill -9 %1
等杀死它。
第四种思路
要退出,请使用q
要离开vi使用:q
第五种思路
-
尝试以下方法之一:
Ctrl
+4
Ctrl
+\
-
或者:
Ctrl
+Z
然后运行:kill %1
%1
是按下Control
– Z
时返回的作业编号。添加-9
强制杀死。
当您在文本控制台中时,您还可以尝试:Ctrl
– SysRq
。内核应该终止进程。
或SysRq
– k
,杀死当前虚拟控制台上的所有进程(也可以杀死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.