无需按 Enter 键即可从后台作业捕获信号

无需按 Enter 键即可从后台作业捕获信号

在 Bash 5 中,我遇到了一种情况,我想要执行以下操作:

trap 'echo trapped!' USR1
while true; do kill -SIGUSR1 $$; sleep 1; done &

但每次发送信号时我都必须按键盘上的 Enter 才能使陷阱代码继续。

实际上,我希望在没有任何键盘交互的情况下执行陷阱。

编辑:

最后我让它像这样工作:

trap 'echo trapped!' USR1
while true; do kill -USR1 $$; kill -INT $$; sleep 1; done &

但我认为该解决方案是解决方法,而不是答案。

答案1

有人似乎有一个非常相似的问题这里
长话短说,如果可以从子进程中内置的陷阱执行命令(在本例中为“echo trap!”)。您可以将命令放入文件中(例如a.sh):

trap 'echo trapped!' USR1
while true; do kill -USR1 $$; sleep 1; done

并作为后台进程执行该文件bash a.sh &
如果不能在子进程中执行此操作,则没有好的解决方案,因为交互式 shell 在等待用户输入命令时执行阻塞读取操作,并且它不处理大多数信号当这种情况发生时(正如您所注意到的,它确实处理 SIGINT)。上面的解决方案之所以有效,是因为陷阱位于非交互式 shell 中(因此当它收到信号时,它并不处于阻塞读取的中间)。

相关内容