在 Unix 中结束进程而不是中断它

在 Unix 中结束进程而不是中断它

Unix命令行上如果我按下Ctrl-C,那并不会结束进程,而是中断它并返回到 shell 提示符。

因此,我有以下两个问题:

    1. 有什么办法可以让我查看所有中断进程的列表并结束它们?
    1. 按下什么组合键可以结束进程而不是中断它?

答案1

Ctrl+C发送SIGINT。默认情况下,这将终止应用程序。

您将其与Ctrl-Z在 bash 中暂停应用程序的 相混淆了。

答案2

历史上,有三个与按键绑定的信号,分别是

  • SIGINT(中断)通常Ctrl+CDel
  • 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

有很多正确答案,但没有一个是完整的。

  1. 正如许多其他人所说的那样:Control-C 通常发送 unix 信号 SIGINT,而默认行为(来自不覆盖它的程序)是“终止进程”。如果需要,程序可以忽略该信号或采取不同的行动。
  2. 您还可以使用 Control-\ 从键盘发送 SIGQUIT。此处的区别在于,默认情况下,进程将写入核心文件,然后退出。如果需要,程序可以忽略该信号或采取不同的行动。
  3. 要以极端方式终止并且不允许进程停止,您可以使用 SIGKILL,默认情况下它不与任何键绑定。相反,您通常使用kill (1)命令并指定要发送的信号,如

    $ kill -9 <process ID>
    

    或助记

    $ kill -KILL <process ID>
    

    该信号由操作系统直接处理,程序可以不是覆盖默认行为。

  4. 如果你的 shell 支持作业控制,那么它也可能支持内置版本,kill该版本支持使用%字符进行作业识别,如下所示catwalk 的答案

  5. 要以可恢复的方式暂停进程,可以使用 Control-z 发送 SIGTSTP。您可以使用以下方式恢复此类进程:fg继续控制终端或bg将其设置为运行没有保持对终端的控制(但默认情况下,仍将其输出发送到那里)。

答案4

Ctrl-C 发送 SIGINT,默认情况下会导致进程结束,但可以被捕获(在 中\bin sh,使用trap)。

SIGKILL 是不可捕获的终止信号。

编辑第三次,我认为这是对的:我已经对照文档检查了所有内容。我们拭目以待。

相关内容