gpt4 book ai didi

linux - 同时启动 2 个终端。只有在第二个输出文本 X 之后才在第一个中执行命令

转载 作者:太空宇宙 更新时间:2023-11-04 12:41:05 25 4
gpt4 key购买 nike

我们有以下用例:

  1. 运行一条命令(第三方,无法控制源代码)启动带有集成“文件观察器”的开发服务器,该“文件观察器”重新编译源文件并在检测到文件更改时重新启动服务器(并将输出发布到/dist 文件夹仅在大约 30 秒过程的最后几秒出现;/dist 文件夹是作为发布过程的最后一步创建的)。
  2. 运行第二个“后处理”命令,该命令仅在前一个命令成功启动服务器并将文件发布到/dist 文件夹时执行(此命令将一些额外的静态文件发布到/dist 文件夹,因此它取决于文件夹的存在)。

这种方法有几个问题:

  • 第 1 步中的命令“窃取”了终端,这意味着它永远不会终止(由于文件监视器)。因此,不能按顺序执行这两个命令。
  • 第二个命令应该等待终端 1 输出特定的字符串(例如“Server Started”),这意味着/dist 文件夹现在已经准备就绪。只有到那时它才会生效。

截至目前,我们已经在第二个终端的开头放置了一个合理的“ sleep ”,以便它等待第一个命令执行发布并且/dist 文件夹存在。问题是在速度较慢的计算机上,这个 sleep 时间不够(第二个命令在第一个命令有足够的时间创建/dist 文件夹之前开始执行)。在快速计算机上,第一个命令完成得相当快,并且在第二个命令开始之前有一段相当尴尬的等待时间。出于开发目的,这非常烦人。

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

换句话说:

有没有办法制作一个终端 X,启动一个辅助终端 Y 并等待终端 Y 输出特定字符串,然后再执行某些操作。并且最好在终端 Y 一遍又一遍地输出所述字符串时执行相同的操作。

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

最佳答案

此答案适用于 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 允许我们对其当前输出进行所谓的“屏幕截图”。这被保存为文本文件,因为(虚拟)终端是基于文本的。

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

关于linux - 同时启动 2 个终端。只有在第二个输出文本 X 之后才在第一个中执行命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40208348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com