如何立即将信号捕获到交互式Bash shell?

时间:2017-10-02 12:26:30

标签: bash signals bash-trap

我尝试从一个终端A向另一个终端B发送信号。两者都运行交互式shell

在B端,我像这样陷阱信号SIGUSR1:

$ trap 'source ~/mycommand' SIGUSR1

现在在终端A,我发送信号如下:

$ kill -SIGUSR1 pidOfB

不幸的是,B中没有任何反应。如果我想执行命令,我需要切换到B并输入新命令或按回车。

如何避免这个缺点并立即执行我的命令?

编辑:

值得注意的是,我想直接与终端B中的交互式shell进行交互。 因此,在子shell中执行trap命令的每个解决方案对我都不起作用......

此外,终端B必须保持互动。

由于

3 个答案:

答案 0 :(得分:1)

shell可能只是卡在阻塞读取中,等待命令行输入。按Enter键会导致处理程序在输入的命令之前执行。运行非阻塞命令,如wait

$ sleep 60 & wait

然后发送信号会导致wait立即终止,然后输出处理程序。

答案 1 :(得分:1)

根据答案和我多次尝试解决这个问题,我不认为可以在交互式bash终端中立即捕获陷阱信号。

要触发,必须有来自用户的互动。

这是由于readline程序块直到输入换行符。并且没有办法阻止这种阅读。

我的解决方案是使用dtach,这是一个模拟屏幕分离功能的小程序。

这个程序可以运行一个完全交互的shell,并在其最后一个版本中提供一种通过自定义套接字与此shell(或您启动的任何程序)进行通信的方式。

要在终端B中启动运行交互式bash的新dtach会话:

$ dtach -a /tmp/MySocket bash -i

现在从终端A,我们可以向终端B中的bash会话发送消息,如下所示:

$ echo 'echo hello' | dtach -p /tmp/MySocket

在B航站楼,我们现在看到:

$ echo hello
hello

如果我现在在终端A中进行扩展:

$ trap' echo" cd $(pwd)" | dtach -p / tmp / MySocket' DEBUG

我将同步两个终端的目录

PS:我还是想知道是否有办法在纯粹的bash中做到这一点

答案 2 :(得分:0)

可能是缓冲。

作为测试,请尝试安装循环触发器。在窗口A:

{ trap 'ls' USR1; while sleep 1; do echo>/dev/null;done } &
[1] 7316
窗口B中的

 kill -usr1 7316

返回窗口A当循环回显时,ls正在触发。 不知道这是否会有所帮助,但它确实存在。