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

时间:2020-01-02 15:02:15

标签: linux bash

有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”。

如何实现?

P.S。我尝试使用“退出”信号代替“ intr”,但是我不确定这样做是否合法。

1 个答案:

答案 0 :(得分:1)

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

#!/bin/bash

sigint () { kill -INT -$$; }
trap sigint INT

echo BEGIN
./script.sh
echo END

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

更新

正如William所说,这也足够了:

#!/bin/bash

trap : INT

echo BEGIN
./script.sh
echo END