【问题标题】:Why SIGINT can stop bash in terminal but not via kill -INT?为什么 SIGINT 可以在终端中停止 bash 但不能通过 kill -INT?
【发布时间】:2014-07-25 07:26:59
【问题描述】:

我注意到当我通过这样的 bash 脚本运行挂起进程时

foo.sh:

sleep 999

如果我通过命令运行它,然后按 Ctrl+C

./foo.sh
^C

睡眠将被中断。但是,当我尝试用 SIGINT 杀死它时

ps aux | grep foo
kill -INT 12345  # the /bin/bash ./foo.sh process

然后看起来 bash 和 sleep 忽略了 SIGINT 并继续运行。这让我很惊讶。我认为 Ctrl + C 实际上是将 SIGINT 发送到前台进程,那么为什么终端中的 Ctrl + C 和 kill -INT 的行为不同?

【问题讨论】:

    标签: linux bash shell signals


    【解决方案1】:

    CtrlC 实际上将SIGINT 发送到前台进程(由bash 进程和@987654323 组成@ 过程)。要对kill 命令执行相同操作,请将信号发送到进程组,例如:

    kill -INT -12345
    

    【讨论】:

      【解决方案2】:

      您的脚本正在执行“sleep 999”,当您按下 CTRL-C 时,运行 sleep 命令的 shell 会将 SIGINT 发送到其前台进程 sleep。但是,当您尝试使用 kill 从另一个窗口终止 shell 脚本时,您没有针对“睡眠”进程,而是针对正在捕获 SIGINT 的父 shell 进程。相反,找到“sleep 999”的进程 ID 并 kill -2 它,它应该退出。

      简而言之,您在测试用例中杀死了 2 个不同的进程,并将苹果与橙子进行比较。

      root     27979 27977  0 03:33 pts/0    00:00:00 -bash   <-- CTRL-C is interpreted by shell
      root     28001 27999  0 03:33 pts/1    00:00:00 -bash
      root     28078 27979  0 03:49 pts/0    00:00:00 /bin/bash ./foo.sh
      root     28079 28078  0 03:49 pts/0    00:00:00 sleep 100  <-- this is what you should try killing
      

      【讨论】:

      • 更具体地说,CTRL-C向前台进程的整个进程group发送SIGINT,这使得该组中的每个进程都接收到信号。
      猜你喜欢
      • 2022-07-07
      • 2013-08-30
      • 1970-01-01
      • 2019-09-26
      • 2020-05-31
      • 1970-01-01
      • 2012-09-05
      • 2017-02-11
      • 1970-01-01
      相关资源
      最近更新 更多