在Unix
命令行上如果我按下Ctrl-C,那并不会结束进程,而是中断它并返回到 shell 提示符。
因此,我有以下两个问题:
- 有什么办法可以让我查看所有中断进程的列表并结束它们?
- 按下什么组合键可以结束进程而不是中断它?
答案1
Ctrl+C发送SIGINT
。默认情况下,这将终止应用程序。
您将其与Ctrl-Z在 bash 中暂停应用程序的 相混淆了。
答案2
历史上,有三个与按键绑定的信号,分别是
- SIGINT(中断)通常Ctrl+C或Del
- SIGQUIT-退出-通常绑定到Ctrl+\
- SIGSUSP 暂停 - 通常绑定到Ctrl+Z
在某些 *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 停止进程可能会更成功,但这可能并非事实,因为进程可能会捕获信号并忽略它。
没有“中断”进程列表的概念,因为进程要么捕获并忽略了中断,要么已经退出。您可以通过输入 jobs 来获取暂停进程的列表
答案3
有很多正确答案,但没有一个是完整的。
- 正如许多其他人所说的那样:Control-C 通常发送 unix 信号 SIGINT,而默认行为(来自不覆盖它的程序)是“终止进程”。如果需要,程序可以忽略该信号或采取不同的行动。
- 您还可以使用 Control-\ 从键盘发送 SIGQUIT。此处的区别在于,默认情况下,进程将写入核心文件,然后退出。如果需要,程序可以忽略该信号或采取不同的行动。
要以极端方式终止并且不允许进程停止,您可以使用 SIGKILL,默认情况下它不与任何键绑定。相反,您通常使用
kill (1)
命令并指定要发送的信号,如$ kill -9 <process ID>
或助记
$ kill -KILL <process ID>
该信号由操作系统直接处理,程序可以不是覆盖默认行为。
如果你的 shell 支持作业控制,那么它也可能支持内置版本,
kill
该版本支持使用%
字符进行作业识别,如下所示catwalk 的答案。- 要以可恢复的方式暂停进程,可以使用 Control-z 发送 SIGTSTP。您可以使用以下方式恢复此类进程:
fg
继续控制终端或bg
将其设置为运行没有保持对终端的控制(但默认情况下,仍将其输出发送到那里)。
答案4
Ctrl-C 发送 SIGINT,默认情况下会导致进程结束,但可以被捕获(在 中\bin sh
,使用trap
)。
SIGKILL 是不可捕获的终止信号。
编辑第三次,我认为这是对的:我已经对照文档检查了所有内容。我们拭目以待。