有 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