使用shell脚本捕获SIGINT的问题



我想阻止CTRL-C,但它不像预期的那样工作。我一直在按照[这里]描述的答案(https://stackoverflow.com/a/37148777/12512199),但没有成功。

我一定是错过了什么,但不知道是什么。这就好像CTRL-C被拦截了,但仍然在传播:

首先,我运行以下脚本并按CTRL-C;显示提示信息,但脚本已退出。

echo  "
#!/bin/bash
trap 'echo "Ctrl + C happened"' SIGINT
sleep infinity
" > test.sh
chmod +x test.sh
./test.sh

然后我检查了它在容器中的行为是否与pid 1不同:

echo  "
#!/bin/bash
trap 'echo "Ctrl + C happened"' SIGINT
sleep infinity
" > test.sh
chmod +x test.sh
docker rm -f conttest
docker container create --name conttest -it --entrypoint="bash" ubuntu:20.04 -x -c /test.sh
docker cp test.sh conttest:/test.sh
docker container start --attach -i conttest

但是不,这是相同的行为。我在Unbuntu 20.04上进行了这些测试。阅读https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#trap,但仍然没有找到任何线索…任何想法?

Control+C或任何其他在输出中映射到intr的组合键stty -a向前台的所有进程发送SIGINT。壳牌接收它,但是sleep infinity也接收它,它死亡,壳层退出因为它没有任何关系。如果你想让你的脚本运行在SIGINT上做一些事情,你必须使用一个endless循环:

#!/bin/bash
trap 'echo "Ctrl + C happened"' SIGINT
while true
do
sleep infinity
done

如果你只想忽略SIGINT:

#!/bin/bash
trap '' SIGINT
sleep infinity

相关内容

  • 没有找到相关文章

最新更新