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

12 linux unix shell

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

所以,我有以下两个问题:

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

Ign*_*ams 20

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

您将此与 混淆Ctrl-Z,后者会在 bash 中暂停应用程序。


Ste*_*eet 7

从历史上看,有三个与击键绑定的信号,它们是

  • SIGINT(中断)通常Ctrl+CDel
  • SIGQUIT - 退出 - 通常绑定到Ctrl+\
  • SIGSUSP Suspend - 通常绑定到Ctrl+Z

在某些 *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 停止进程可能会更成功,但这可能不是真的,因为进程可能会捕获信号并忽略它。

没有“中断”进程列表的概念,因为进程要么捕获并忽略了中断,要么已经退出。您可以通过键入作业来获取挂起的进程列表


dmc*_*ten 5

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

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

    $ kill -9 <process ID>
    
    Run Code Online (Sandbox Code Playgroud)

    或助记符

    $ kill -KILL <process ID>
    
    Run Code Online (Sandbox Code Playgroud)

    该信号由操作系统直接处理,程序无法覆盖默认行为。

  4. 如果您的 shell 支持作业控制,它也可能支持内置版本,kill该版本支持使用catwalk 的答案中%字符进行作业识别。

  5. 要以可恢复的方式暂停进程,请使用发送 SIGTSTP 的 Control-z。您可以fg通过继续控制终端或bg控制终端的情况下将其设置为运行来恢复这样的进程(但默认情况下,仍将其输出发送到那里)。