使 TTY 中断杀死子进程,但不杀死父 shell



有 2 个 bash 脚本:

  • script.sh

    #!/bin/bash
    # Set terminal interrupt signal to 'ctrl+]'
    stty intr ^]
    for i in $(seq 1 1000); do 
    echo $i;
    sleep 1;
    done;
    
  • script_runner.sh

    #!/bin/bash
    echo BEGIN
    ./script.sh
    echo END
    

以下是它的工作原理:

  • "script_runner.sh"运行"script.sh"。
  • "script.sh"运行循环,在某个执行点按下"CTRL-]"。
  • "intr"信号触发,所有 shell 脚本(包括父脚本(停止其作业。

同时,我希望,父母应该继续工作并打印"END"。

如何实施?

附言我尝试使用"退出"信号而不是"intr",但我不确定这是否是合法的方式。

您可以将 SIGINT 转发到子进程。以这种方式更改script_runner.sh

#!/bin/bash
sigint () { kill -INT -$$; }
trap sigint INT
echo BEGIN
./script.sh
echo END

script_runner.sh获取 SIGINT 时,它会将其转发到进程组中的所有进程。这将终止子外壳并sleep

更新

正如威廉评论的那样,这也足够了:

#!/bin/bash
trap : INT
echo BEGIN
./script.sh
echo END

最新更新