从另一个 TTY 会话的 STDIN 流缓冲区中删除数据

从另一个 TTY 会话的 STDIN 流缓冲区中删除数据

前几天,我tty在单独的终端窗口中运行多个会话时遇到了问题。我正在运行一个昂贵的磁盘访问命令并正在等待它返回。与此同时,我正在tty图形桌面环境中的一个单独窗口中的另一个会话中工作。

我无意中聚焦于运行磁盘访问命令(基本上是一个命令)的终端cp,并在终端中输入以下内容,以为我要将其输入到我的另一个窗口中:

Enter

基于这个问题我知道数据现在位于STDIN数据流缓冲区中,等待第一个命令返回后立即运行cp。如您所知,我只是告诉命令再次运行:/。

问题

因为我有一些时间(这个命令需要 > 30 分钟才能返回),有没有办法在 bash 重新运行它正在完成的过程之前将这些字符从STDIN缓冲区中刷新出来?tty

或者除了尝试将数据从另一个 bash 实例的文件流缓冲区中刷新之外,还有其他方法可以避免在我等待的进程完成后立即评估数据吗?

答案1

如果您的 tty 已noflsh关闭该标志 - 您可以检查

stty -a < /dev/pts/whatever | grep -e -noflsh

从另一个 tty,但默认情况下它是关闭的 - 然后输入中断、退出或挂起字符将刷新输入队列。因此,如果您键入Ctrl-Z, then fg,它将挂起当前正在运行的命令,刷新输入,然后恢复该命令。

答案2

也许您应该向 bash 发送 SIGSTOP 以防止它执行任何操作,并在完成任务后向 bash 发送 SIGKILL 。

请注意,SIGSTOP 会阻止 bash 等待您的任务完成,否则您将陷入僵尸状态。 SIGKILL init 后将重新调整您的任务,僵尸将消失。

相关内容