我尝试从一个终端A向另一个终端B发送信号。两者都运行交互式shell 。
在B端,我像这样陷阱信号SIGUSR1:
$ trap 'source ~/mycommand' SIGUSR1
现在在终端A,我发送信号如下:
$ kill -SIGUSR1 pidOfB
不幸的是,B中没有任何反应。如果我想执行命令,我需要切换到B并输入新命令或按回车。
如何避免这个缺点并立即执行我的命令?
编辑:
值得注意的是,我想直接与终端B中的交互式shell进行交互。 因此,在子shell中执行trap命令的每个解决方案对我都不起作用......
此外,终端B必须保持互动。
由于
答案 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
正在触发。
不知道这是否会有所帮助,但它确实存在。