在Unix
命令行中,如果按Ctrl-C,则该操作不会结束进程,而是会中断进程,然后返回到shell提示符。
因此,我有以下两个问题:
- 有没有办法查看所有中断进程的列表并结束它们?
- 按什么组合键可以结束一个过程而不是中断它?
在Unix
命令行中,如果按Ctrl-C,则该操作不会结束进程,而是会中断进程,然后返回到shell提示符。
因此,我有以下两个问题:
Answers:
Ctrl+ C发送一个SIGINT
。默认情况下,这将终止应用程序。
您将其与混淆Ctrl-Z,后者将应用程序挂起在bash中。
从历史上看,有三个信号绑定到击键,这些是
在某些* nix风格上,还绑定了其他信号,您可以使用以下命令检查键盘绑定
stty -a
在我的系统OS / X上,这将产生以下输出
speed 9600 baud; 65 rows; 213 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
-echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
-extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
-ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
-dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
stop = ^S; susp = ^Z; time = 0; werase = ^W;
请注意,在这种情况下,kill并非KILL信号,而是与清除当前输入缓冲区有关。
使用SIGQUIT停止进程可能会取得更大的成功,但这可能不是正确的,因为进程可能会捕获信号并忽略它。
没有“已中断”进程列表的概念,因为该进程已捕获并忽略了该中断或已退出。您可以通过输入作业来获取挂起进程的列表
许多正确答案,但没有一个是完整的。
要以极端的偏见终止而不允许进程停止,请使用SIGKILL,它默认情况下不与任何键绑定。相反,您通常使用kill (1)
命令发送它,并指定要发送的信号
$ kill -9 <process ID>
或助记符
$ kill -KILL <process ID>
该信号由操作系统直接处理,程序无法覆盖默认行为。
如果您的Shell支持作业控制,则它可能还支持其内置版本,kill
该版本支持使用Catwalk的answer中的%
字符进行作业识别。
fg
通过继续控制终端或bg
在不保持终端控制的情况下使它继续运行来恢复这样的过程(但是,默认情况下,仍将其输出发送到那里)。对于大多数终端新手来说,这还不是很清楚,但是如果您的问题只是您在一个交互式程序中,而您又不知道该如何退出,那么很多时候q
就会退出。例如,这是退出的关键less
,它也是查看man
页面时获得的程序等。
某些程序还有其他键盘快捷键可以退出。在vim
或vi
中使用ESC:wq
。在emacs
,使用Control-C Control-X
。在nano
或pico
中使用Control-X
。请注意,在这些示例中,存在一些细微之处,特别是关于这些快捷方式是否保存了您可能正在编辑的文件所做的任何更改。
许多进程可以安装中断处理程序来捕获中断信号,但是默认情况下不会中断的那些处理程序。
要强制退出进程,可以发送SIGQUIT(Ctrl- \)。
stty -ixon
了它们以便通过。我认为他们会变成<undef>
。