在Unix
命令行中,如果我按Ctrl-C,这不会结束进程,而是中断它,然后我返回到 shell 提示符。
所以,我有以下两个问题:
从历史上看,有三个与击键绑定的信号,它们是
在某些 *nix 风格上,还绑定了其他信号,您可以使用以下命令检查键盘绑定
stty -a
Run Code Online (Sandbox Code Playgroud)
在我的系统 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;
Run Code Online (Sandbox Code Playgroud)
请注意,在这种情况下,kill 不是 KILL 信号,它与清除当前输入缓冲区有关。
使用 SIGQUIT 停止进程可能会更成功,但这可能不是真的,因为进程可能会捕获信号并忽略它。
没有“中断”进程列表的概念,因为进程要么捕获并忽略了中断,要么已经退出。您可以通过键入作业来获取挂起的进程列表
很多正确的答案,但没有一个是完整的。
要以极端的偏见终止并且不允许进程停止,请使用 SIGKILL,默认情况下它不绑定到任何键。相反,您通常使用kill (1)
命令发送它并指定要发送的信号,如
$ kill -9 <process ID>
Run Code Online (Sandbox Code Playgroud)
或助记符
$ kill -KILL <process ID>
Run Code Online (Sandbox Code Playgroud)
该信号由操作系统直接处理,程序无法覆盖默认行为。
如果您的 shell 支持作业控制,它也可能支持内置版本,kill
该版本支持使用catwalk 的答案中的%
字符进行作业识别。
fg
通过继续控制终端或bg
在不控制终端的情况下将其设置为运行来恢复这样的进程(但默认情况下,仍将其输出发送到那里)。