同时启动2个终端。仅在第二个输出文本X

时间:2016-10-23 22:19:04

标签: linux bash terminal sh

我们有以下用例:

  1. 运行一个命令(第三方,无法控制源代码),它使用集成的"文件观察器启动开发服务器"重新编译源文件并在检测到文件更改时重新启动服务器(并且仅在~30秒进程的最后几秒将输出发布到/ dist文件夹; / dist文件夹作为发布的最后一步创建处理)。
  2. 运行辅助"后处理"只应在上一个命令成功启动服务器并将文件发布到/ dist文件夹时执行的命令(此命令将一些其他静态文件发布到/ dist文件夹,因此它取决于文件夹的存在)。
  3. 这种方法存在几个问题:

    • 来自步骤1&#34的命令;窃取"终端,意味着它永远不会终止(由于文件观察者)。因此,顺序执行这两个命令不是一种选择。
    • 第二个命令应该等待终端1输出某个字符串(例如" Server Started"),这意味着/ dist文件夹现在已准备就绪。只有这样它才能生效。

    到目前为止,我们已经做了一个合理的睡眠"在第二个终端的开头,只是等待第一个命令进行发布并且/ dist文件夹存在。问题是在较慢的计算机上这个睡眠时间是不够的(第二个命令在第一个命令有足够的时间创建/ dist文件夹之前开始执行)。在快速计算机上,第一个命令完成得相当快,并且在第二个命令启动之前有一个相当尴尬的等待时间。出于开发目的,这非常烦人。

    有没有办法自动化这两个步骤?

    改写:

    有没有办法制作终端X,启动辅助终端Y并等待终端Y在执行某些操作之前输出某个字符串。当终端Y一遍又一遍地输出所述字符串时,最好做同样的动作。

    如果可能的话,我们更喜欢Windows解决方案,但如果找不到解决方案,Linux也是一种选择。

1 个答案:

答案 0 :(得分:0)

本答案适用于Linux解决方案;

所以,第一部分:自动启动两个终端。 一旦自动化,终端是否需要被任何人真正看到?如果没有,我会在屏幕上运行它们。 screen命令允许您创建虚拟终端,可以根据需要进行附加和分离。要在运行命令的情况下自动启动屏幕,请使用

screen -S meaningful_service_name -d -m ./ ProcessA

这里,“-S”将屏幕名称设置为人类可读的,稍后可以引用,“-d -m”表示以分离模式启动屏幕(适用于启动脚本),并运行跟在里面的命令。这些屏幕将在后台运行(直到程序退出或杀死它们),并且可以由用户通过screen -r meaningful_service_name从终端连接。然后用户可以通过按Ctrl-A然后按D.断开连接。还允许您通过SSH远程监控进程。

-

这导致第二部分:仅在A打印到屏幕后启动ProcessB。 屏幕允许我们采用其当前输出的所谓“屏幕截图”。这被保存为文本文件,因为(虚拟)终端是基于文本的。

screen -S meaningful_service_name -p 0 -X hardcopy /some/file/location.txt

这里,“ - p”表示基本上是当前窗口(通常应为零),“ - X”表示执行以下命令。现在您有一个带有ProcessA输出的文本文件,您可以像搜索任何其他文本文件一样进行搜索。

#!/bin/bash
while true; do
screen -S meaningful_service_name -p 0 -X hardcopy /some/file/location.txt
if [[ $(cat /some/file/location.txt | grep "ProcessA's Output" | wc -l) -ge 1 ]]
then
break
fi
sleep 2
done
./ ProcessB