linux - 为什么 shell 在后台进程中忽略 SIGINT 和 SIGQUIT?

标签 linux shell unix signals posix

如果我在脚本或 -c 代码片段中后台运行一个进程,后台进程将忽略 SIGINT 和 SIGQUIT:

例子:

$ alias ps='ps -o pid,ppid,pgrp,sid,stat,tty,ignored,blocked,caught,wchan,min_flt,pmem,args --forest'
$ sh -c 'sleep 1000 & sleep 1000 | sleep 1000' & \
  sleep 0.01; ps |grep -v -e ps -e grep 
  PID  PPID  PGRP   SID STAT TT                IGNORED          BLOCKED           CAUGHT WCHAN   MINFL %MEM COMMAND
 6197  2143  6197  6197 Ss   pts/28   0000000000380004 0000000000010000 000000004b817efb wait    10039  0.0 -bash
 7593  6197  7593  6197 S    pts/28   0000000000000000 0000000000000000 0000000000010002 wait      148  0.0  \_ sh -c sleep 1000 & sleep 1000 | sleep 1000
 7595  7593  7593  6197 S    pts/28   0000000000000006 0000000000000000 0000000000000000 hrtime     85  0.0  |   \_ sleep 1000
 7596  7593  7593  6197 S    pts/28   0000000000000000 0000000000000000 0000000000000000 hrtime     85  0.0  |   \_ sleep 1000
 7597  7593  7593  6197 S    pts/28   0000000000000000 0000000000000000 0000000000000000 hrtime     85  0.0  |   \_ sleep 1000

这意味着如果我从交互式父 shell 运行 kill -INT -$!(或 fg 后跟 Ctrl-C) (bash),以 -c 片段为背景的 sleep 进程未到达并继续存在。

  PID  PPID  PGRP   SID STAT TT                IGNORED          BLOCKED           CAUGHT WCHAN   MINFL %MEM COMMAND
 6197  2143  6197  6197 Ss   pts/28   0000000000380004 0000000000010000 000000004b817efb wait    10103  0.0 -bash
 7595     1  7593  6197 S    pts/28   0000000000000006 0000000000000000 0000000000000000 hrtime     85  0.0 sleep 1000

这种行为的原因是什么?可以禁用吗?

最佳答案

当 shell 在后台运行程序时,后台进程不应再绑定(bind)到原始 shell -- shell 可以退出或被杀死,后台进程应继续运行。

如果 shell 是交互式的并且正在使用作业控制,它会将后台进程放在一个单独的进程组中,因此发送到 shell 进程组的信号不会影响它。

但是当不使用作业控制时,这是非交互式 shell 中的默认设置,后台进程在同一个进程组中。为了避免后台进程接收仅供 shell 使用的键盘信号,它显然会忽略那些子进程中的这些信号。

关于linux - 为什么 shell 在后台进程中忽略 SIGINT 和 SIGQUIT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45106725/

相关文章:

hibernate - 尝试从 shell 使用 grails 域类

linux - 树莓派关机脚本

c - 内核到用户空间的低延迟通信

unix - 如何 grep 查找整个单词

linux - 当我尝试使用 "make"安装某些东西时,为什么我的权限被拒绝?

mysql dump无法解压mysql文件

postgresql - Dockerfile与Shell

linux - Linux 中的 'stale file handle' 是什么意思?

linux - 将历史从某一行兑换到另一行

node.js - 我的Raspberry pi服务器已连接到无线wifi,但无法从互联网访问它