8
这是一个简单的程序,它注册两个trap
处理程序,然后用trap -p
显示它们。然后它做同样的事情,但在儿童后台进程。bash:为什么我不能在后台shell中为SIGINT设置陷阱?
为什么后台进程忽略SIGINT
陷阱?
#!/bin/bash
echo "Traps on startup:"
trap -p
echo ""
trap 'echo "Received INT"' INT
trap 'echo "Received TERM"' TERM
echo "Traps set on parent:"
trap -p
echo ""
(
echo "Child traps on startup:"
trap -p
echo ""
trap 'echo "Child received INT"' INT
trap 'echo "Child received TERM"' TERM
echo "Traps set on child:"
trap -p
echo ""
) &
child_pid=$!
wait $child_pid
输出:
$ ./show-traps.sh
Traps on startup:
Traps set on parent:
trap -- 'echo "Received INT"' SIGINT
trap -- 'echo "Received TERM"' SIGTERM
Child traps on startup:
Traps set on child:
trap -- 'echo "Child received TERM"' SIGTERM
你可以扩展一下'set -m' - 它是什么以及它是如何完成的?我正在寻找一种解决方法,我可以将SIGINT发送到bg进程。谢谢。 – drevicko
@revicko在联机帮助页中搜索“monitor”。监视模式('set -m')导致命令(管道)在不同的进程组中运行。你可能不想要那个。但是,如果你在后台进程中运行一个可执行文件,那么通过一个封装来启动它是很简单的,它将撤消SIGINT忽略(不做任何事情)。 (如果你不知道该怎么做,请提问,我会发布代码。) – PSkocik
非常感谢!问题是[这里](https://stackoverflow.com/questions/49178556/how-do-i-launch-a-background-process-through-a-wrapper-thatll-undo-the-sigint-i)。 – drevicko